Don’t Use Accessor Methods in Initializer Methods and dealloc 【初始化和dealloc方法中不要调用属性的存取方法,而要直接调用 _实例变量】

 

1.问题:   

在dealloc方法中使用[self.xxx release]和[xxx release]的区别?

用Xcode的Analyze分析我的Project,会列出一堆如下的提示:
Incorrect decrement of the reference count of an object that is not owned at this point by the caller

仔细看了下代码,都是在dealloc方法中使用了[self.xxx release]这样的语句引起的,把代码改成了[xxx release]就没有问题了

但我不明白究竟原因为何?我的理解是:不管@property xxx这里设定了是retain, copy还是assign,影响的总是setter方法,getter方法不会边,就是简单地return xxx完事了。而self.xxx就是调用[self getXxx]一样的,那么为什么这样的代码会引起Xcode Analyze的警告呢?

 

2.答案:

self.xxx调用的是getter,而getter并非想当然的是 - (id) xxx{ return _xxx; }.
有可能是  - (id) xxx{  return [[xxx retain] autorelease]; }还有各种情况。这时候你发release就不只是你想的_xxx接收的了。 

所以,在dealloc里面可以这样释放:
self.xxx = nil;
或者是 [_xxx release];

这边有两个帖子,我觉得不错:
链接1:stackoverflow.com/questions/7262268/why-shouldnt-i-use-the-getter-to-release-a-property-in-objective-c

链接2:developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447-S

 

3.总结:

Don’t Use Accessor Methods in Initializer Methods and dealloc【初始化和dealloc方法中不要调用属性的存取方法,而要直接调用 _实例变量】。

Accessor methods  存取器方法; 访问方法; 存取方法; 访问函数; 访问器方法;

posted @ 2016-03-31 13:00 stevenwuzheng 阅读(...) 评论(...) 编辑 收藏