• 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  存取器方法; 访问方法; 存取方法; 访问函数; 访问器方法;

    iOS开发者交流群:180080550
  • 相关阅读:
    散列表
    5月19日
    5月17日阅读笔记3
    5月15日 阅读笔记2
    5月14日 阅读笔记1
    团队5
    团队博客2
    团队博客4
    团队博客3
    团队博客1
  • 原文地址:https://www.cnblogs.com/stevenwuzheng/p/5340773.html
Copyright © 2020-2023  润新知