【发布时间】:2023-03-26 18:51:01
【问题描述】:
在 XCode 3.2 和 Nikita Zhuk's Analysis Tool 中使用 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;
}
【问题讨论】:
标签: objective-c cocoa clang clang-static-analyzer