2012-06-08 14 views
1

我有这个保留的财产声明如下:为什么XCode静态分析器无法检测未发布的保留属性?

@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

分析仪为什么不选择这个?

+0

你使用ARC吗?它可能是ARC为你发布的。 – Andy

+0

为什么你忘了?不要。提示将你的dealloc立即放在@synthesize下面,当你用copy创建一个新的道具时,或者只是将它添加到dealloc中。遵循这个规则,你永远不会有这个概率。 –

+0

@EtileVed不,这是一个旧项目,没有配置改变使用ARC。 – aslisabanci

回答

1

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

您可以设想将您的codes数组的所有权转交给某种外部方法或库,稍后将为您发布它。这将是不好的做法,因为如果需要的话,接收方法应该保留它,但是我没有见过这种由缺乏经验的开发人员完成的事情。

所以你可能在你的类的地方看到:

[SomeAPI takeThisArrayAndReleaseItLater:codes]; 

分析仪有没有办法知道你的类不再负责释放阵列。尽管你没有遵循好的内存管理规范,但给你一个警告是不正确的。

该分析仪非常擅长仅在实际问题上发出警告。我认为我以前从未见过在beta版本之外的假阳性,这是一件好事。

0

如果你没有改变配置中的任何东西,当你定位ios5 +时,你将自动使用ARC(自动引用计数),它不需要你释放或保留。

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

这是一篇iOS教程团队成员Matthijs Hollemans,一位经验丰富的iOS开发人员和设计师。

+0

它不仅不需要你,它*禁止*你。 – borrrden

+0

但分析器显示一个问题,如果我分配/初始化一个方法内的数组,然后不释放它。这种差异的原因是什么? – aslisabanci

+0

使用ARC时,分析仪不会发出这些类型的警告。显然,OP没有使用ARC。 –

相关问题