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版本),你可以"构建和分析".所有分析结果都会很好地与您的代码一起呈现.
原因很可能是使用发送buttonWithType:和initWithFrame:消息.init*方法执行的任务只能对给定对象执行一次.创建对象的类方法也会初始化它们.您的代码的结果是重复初始化.而是发送buttonWithType消息,然后分配给frame属性.
| 归档时间: |
|
| 查看次数: |
7094 次 |
| 最近记录: |