在 XCode 3.2 和Nikita Zhuk 的分析工具中使用 clang 运行静态分析我经常遇到这对警告:
方法返回一个具有 +0 保留计数的 Objective-C 对象(非拥有引用)
调用者此时不拥有对象引用计数的不正确递减
可能引发此警告的代码示例:
UIButton* button = [[UIButton buttonWithType:UIButtonTypeCustom] initWithFrame: CGRectMake(x, y, width, height)];
return button;
我假设以这种方式创建的按钮是自动释放的,就像使用便利工厂方法创建的任何其他 NSObject 一样。所以我返回它,调用者可以决定是否保留它。那有什么问题?
我有义务在返回之前保留并自动释放对象吗?最重要的是,这个警告所警告的东西是否会成为可怕的发布相关崩溃的原因?
我现在意识到这似乎只发生在 UIButtons 上。是因为它是一个类集群吗?
编辑:下面的片段显示了clang发出这些警告的最小情况(警告以粗体显示)。buttonWithType:
这两个警告都在创建对象(消息)的语句上标记。
-(UIButton*) ztupidTezt:(UIImage*) img
{
UIButton* bt = [[UIButton buttonWithType:UIButtonTypeCustom]initWithFrame:
1 方法返回一个具有 +0 保留计数的 Objective-C 对象(非拥有引用)
2 调用者此时不拥有对象的引用计数的错误递减
CGRectMake(0.0f, 0.0f, img.size.width, img.size.height)];
bt setImage:img forState:UIControlStateNormal];
return bt;
}