Iphone 为什么XCode静态分析器无法检测未发布的保留属性?
我已将该保留财产声明如下:Iphone 为什么XCode静态分析器无法检测未发布的保留属性?,iphone,objective-c,ios,xcode,static-analysis,Iphone,Objective C,Ios,Xcode,Static Analysis,我已将该保留财产声明如下: @property (nonatomic, retain) NSMutableDictionary *codes; self.codes = [NSMutableDictionary dictionary]; 然后我综合这个: @synthesize codes; 我使用的属性如下: @property (nonatomic, retain) NSMutableDictionary *codes; self.codes = [NSMutableDictiona
@property (nonatomic, retain) NSMutableDictionary *codes;
self.codes = [NSMutableDictionary dictionary];
然后我综合这个:
@synthesize codes;
我使用的属性如下:
@property (nonatomic, retain) NSMutableDictionary *codes;
self.codes = [NSMutableDictionary dictionary];
然后,我忘了说[code release]代码>在mydealloc
中
当我在XCode 4.3.2中运行Analyzer时,这并没有显示为问题。我的基本SDK是iOS 5.1,我的编译器是Apple LLVM编译器3.1
为什么analyzer没有检测到这一点?如果您没有对配置进行任何更改,当您以ios5+为目标时,您将自动使用ARC(自动参考计数),而不需要您释放或保留
iOS 5中最具破坏性的变化是添加了自动
参考计数,简称ARC。ARC是新LLVM的一项功能
3.0编译器,它完全取消了所有iOS开发人员都讨厌的手动内存管理
这是iOS教程团队成员Matthijs Hollemans的一篇文章,他是一位经验丰富的iOS开发人员和设计师。如果您没有更改任何配置,当您以ios5+为目标时,您将自动使用ARC(自动引用计数),而不需要您发布或保留
iOS 5中最具破坏性的变化是添加了自动
参考计数,简称ARC。ARC是新LLVM的一项功能
3.0编译器,它完全取消了所有iOS开发人员都讨厌的手动内存管理
这是iOS教程团队成员Matthijs Hollemans的一篇文章,他是一位经验丰富的iOS开发人员和设计师。我想这是因为分析器无法可靠地检测跨方法/库边界的保留/发布问题
可以想象,您可以将代码
数组的所有权传递给一些外部方法或库,这些方法或库稍后将为您发布它。这将是一种糟糕的做法,因为接收方法应该在需要时保留它,但我见过没有经验的开发人员做过这种事情
所以你可能会在课堂上的某个地方看到:
[SomeAPI takeThisArrayAndReleaseItLater:codes];
分析器无法知道您的类不再负责释放数组。尽管您没有遵循良好的内存管理实践,但给您一个警告是不正确的
分析仪非常擅长于仅在实际问题上发出警告。我认为我从未在betas构建之外看到过假阳性,这是一件好事。我想这是因为分析器无法可靠地检测跨方法/库边界的保留/发布问题
可以想象,您可以将代码
数组的所有权传递给一些外部方法或库,这些方法或库稍后将为您发布它。这将是一种糟糕的做法,因为接收方法应该在需要时保留它,但我见过没有经验的开发人员做过这种事情
所以你可能会在课堂上的某个地方看到:
[SomeAPI takeThisArrayAndReleaseItLater:codes];
分析器无法知道您的类不再负责释放数组。尽管您没有遵循良好的内存管理实践,但给您一个警告是不正确的
分析仪非常擅长于仅在实际问题上发出警告。我认为我从未在betas构建之外看到过假阳性,这是一件好事。你在使用ARC吗?很可能是给你的。你为什么忘了?别这样。提示:将您的dealloc立即放在@synthetic下,当您使用copy或retain编写新道具时,只需将其添加到dealloc中即可。遵循此规则,您将永远不会遇到此问题。@EtileVed no,这是一个旧项目,没有任何配置更改为使用ARC。@AlexTerente我没有忘记,实际上,我正在查看其他人的代码,我看到了这一点。然后我想知道为什么这没有出现在分析仪上。谢谢:]你在用ARC吗?很可能是给你的。你为什么忘了?别这样。提示:将您的dealloc立即放在@synthetic下,当您使用copy或retain编写新道具时,只需将其添加到dealloc中即可。遵循此规则,您将永远不会遇到此问题。@EtileVed no,这是一个旧项目,没有任何配置更改为使用ARC。@AlexTerente我没有忘记,实际上,我正在查看其他人的代码,我看到了这一点。然后我想知道为什么这没有出现在分析仪上。感谢:]它不仅不要求您这样做,而且禁止您这样做。但是如果我在方法中alloc/init一个数组,然后不在那里释放它,那么分析器会显示一个问题。产生这种差异的原因是什么?当使用ARC时,分析仪不会对这类事情发出警告。很明显,OP没有使用ARC。@Borrden不,如果你愿意,你可以禁用ARC。@MikeWeller这个问题没有提到任何警告,所以它不是很清楚。顺便说一句,op是什么?它不仅不要求您这样做,而且禁止您这样做。但是,如果我在方法中alloc/init一个数组,然后不在那里释放它,那么分析器会显示一个问题。产生这种差异的原因是什么?当使用ARC时,分析仪不会对这类事情发出警告。很明显,OP没有使用ARC。@Borrden不,如果你愿意,你可以禁用ARC。@MikeWeller这个问题没有提到任何警告,所以它不是很清楚。顺便问一下,什么是op?