Clang:什么是"方法返回一个带有+0保留计数的Objective-C对象"试图告诉我?

Fel*_*xyz 3 cocoa objective-c clang clang-static-analyzer

在XCode 3.2和Nikita Zhuk的分析工具中使用clang运行静态分析我经常会遇到这样的警告:

方法返回一个带有+0保留计数的Objective-C对象(非拥有引用)

此时,调用者不拥有对象引用计数的不正确减量

可能引发此警告的代码示例:

UIButton* button = [[UIButton buttonWithType:UIButtonTypeCustom] initWithFrame: CGRectMake(x, y, width, height)];
return button;
Run Code Online (Sandbox Code Playgroud)

我假设以这种方式创建的按钮是自动释放的,就像使用便利工厂方法创建的任何其他NSObject一样.所以我回复它,调用者可以决定是否保留它.有什么问题?

在返回之前,我是否有义务保留并自动释放对象?最重要的是,无论这个警告警告什么,都可能导致可怕的释放相关的崩溃?

我现在意识到这似乎只发生在UIButton上.是因为它是一个类集群吗?

编辑:下面的剪辑显示了一个最小的情况,其中clang发出这些警告(警告以粗体显示).在创建对象(buttonWithType:消息)的语句中标记两个警告.

-(UIButton*) ztupidTezt:(UIImage*) img
{
  UIButton* bt = [[UIButton buttonWithType:UIButtonTypeCustom]initWithFrame:
Run Code Online (Sandbox Code Playgroud)

1方法返回一个具有+0保留计数的Objective-C对象(非拥有引用)

2调用者此时不拥有对象引用计数的不正确减量

    CGRectMake(0.0f, 0.0f, img.size.width, img.size.height)];
    bt setImage:img forState:UIControlStateNormal];
    return bt;
}
Run Code Online (Sandbox Code Playgroud)

bbu*_*bum 12

嗯......那段代码毫无意义.

buttonWithType:返回已初始化的UIButton实例.你不应该拜访-initWithFrame:它.

打电话setFrame:.

糟糕的代码使分析仪混乱.

其次,为什么还要使用第三方工具来进行分析.如果你在Snow Leopard上使用Xcode 3.2(你应该 - 它是一个比Leopard上一个版本更好的Xcode版本),你可以"构建和分析".所有分析结果都会很好地与您的代码一起呈现.


out*_*tis 6

原因很可能是使用发送buttonWithType:initWithFrame:消息.init*方法执行的任务只能对给定对象执行一次.创建对象的类方法也会初始化它们.您的代码的结果是重复初始化.而是发送buttonWithType消息,然后分配给frame属性.