为什么XCode静态分析器无法检测未释放的保留属性?

时间:2012-06-08 07:32:01

标签: iphone objective-c ios xcode static-analysis

我将此保留属性声明为:

@property (nonatomic, retain) NSMutableDictionary *codes;

然后我合成了这个:

@synthesize codes;

我使用这样的属性:

self.codes = [NSMutableDictionary dictionary];

然后,我忘了在[codes release];中说dealloc

当我在XCode 4.3.2中运行Analyzer时,这不会显示为问题。我的基础SDK是iOS 5.1,我的编译器是Apple LLVM编译器3.1

为什么分析仪没有选择它?

2 个答案:

答案 0 :(得分:1)

我想这是因为分析器无法可靠地检测跨方法/库边界的保留/释放问题。

您可以想象将您的codes数组的所有权传递给某些外部方法或库,以便稍后为您发布。这将是不好的做法,因为接收方法应该只在需要时保留它,但我已经看到这种事情由没有经验的开发人员完成。

所以你可能会在你的课堂上看到这个:

[SomeAPI takeThisArrayAndReleaseItLater:codes];

分析器无法知道您的类不再负责释放阵列。尽管您没有遵循良好的内存管理实践,但是为了给您发出警告是不正确的。

分析仪非常善于警告实际问题。我不认为我曾经在贝塔建筑物外面看到过假阳性,这是一件好事。

答案 1 :(得分:0)

如果您没有更改配置中的任何内容,当您定位ios5 +时,您将自动使用ARC(自动引用计数),这不需要您释放或保留。

  

iOS 5中最具破坏性的变化是增加了自动功能   引用计数,简称ARC。 ARC是新LLVM的一个特性   3.0编译器,它完全取消了所有iOS开发人员都喜欢讨厌的手动内存管理。

这是iOS Tutorial团队成员Matthijs Hollemans的帖子,他是一位经验丰富的iOS开发人员和设计师。