苹果在《Advanced Memory Management Programming Guide》指出:

Don’t Use Accessor Methods in Initializer Methods and dealloc The only places you shouldn’t use accessor methods to set an instance variable are in initializer methods and dealloc. To initialize a counter object with a number object representing zero, you might implement an init method as follows:

- init {
self = [super init];
if (self) {
_count = [[NSNumber alloc] initWithInteger:0];
}
return self;
}

唯一不需要使用Accessor Methods的地方是initializer和dealloc. 在苹果官方文档中没有解释为什么。经过一番查阅后,最主要的原因是此时对象的状况不确定,尚未完全初始化完毕,而导致一些问题的发生。

例如这个类或者子类重写了setMethod,里面调用了其他一些数据或方法,而这些数据和方法需要一个已经完全初始化好的对象。而在init中,对象的状态是不确定的。

举个例子,一个子类重写了set方法,在里面进行了一些子类特有的操作,而此时如果父类在init直接使用Accessor Methods,就会导致问题的发送。

其它一些问题还有,像会触发KVO notification等。

总之,记住在开发中记住这个principle最重要。

在开发中,我发现还是有人因为疏忽或不知道而直接在init方法里面使用self.property = XXX来进行赋值,留下了一些隐患。

不要在初始化方法和dealloc方法中使用Accessor Methods的更多相关文章

  1. Spring容器中的Bean几种初始化方法和销毁方法的先后顺序

    https://blog.csdn.net/caihaijiang/article/details/8629725

  2. 为什么不能在init和dealloc函数中使用accessor方法

    前言 为什么不要在init和dealloc方法中调用getter和setter:Apple在Mac与iOS中关于内存管理的开发文档中,有一节的题目为:"Don'tUse Accessor M ...

  3. (转载)OC学习篇之---类的初始化方法和点语法的使用

    昨天介绍了OC中类的定义和使用,今天我们来继续学习类的初始化方法和点语法的使用. 一.首先来看一下类的初始化方法 在Java中我们知道一个每个类都有构造方法,这里的初始化方法就是和构造方法一个概念的, ...

  4. OC学习篇之---类的初始化方法和点语法的使用

    昨天介绍了OC中类的定义和使用:http://blog.csdn.net/jiangwei0910410003/article/details/41657603,今天我们来继续学习类的初始化方法和点语 ...

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

    1.问题:    在dealloc方法中使用[self.xxx release]和[xxx release]的区别? 用Xcode的Analyze分析我的Project,会列出一堆如下的提示:Inco ...

  6. Objective-C 内存管理之dealloc方法中变量释放处理

    本文转载至 http://blog.sina.com.cn/s/blog_a843a8850101ds8j.html   (一).关于nil http://cocoadevcentral.com/d/ ...

  7. 不要在init和dealloc函数中使用accessor

    不要在init和dealloc函数中使用accessor 文章目录 Objective-C 2.0 增加了 dot syntax,用于简单地调用成员变量的 accessor.相当于 java 的 ge ...

  8. UML和模式应用4:初始阶段(6)--迭代方法中如何使用用例

    1.前言 用例是UP和其他众多迭代方法的核心.UP提倡用例驱动开发. 2. 迭代方法中如何使用用例 功能需求首先定义在用例中 用例是迭代计划的重要部分,迭代是通过选择一些用例场景或整个用例来定义的 用 ...

  9. OC对象中的getter方法中不能用self.

    @interface boy:NSObject { int _age; } - (void)setAge:(int)age; - (int)age; @end @implementation boy ...

随机推荐

  1. Linux第三次实验报告

    北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全系统设计基础             班级:201352 姓名:池彬宁 贺邦 学号:20135212 2013520 ...

  2. 20135328信息安全系统设计基础第一周学习总结(Linux应用)

    学习计时:共xxx小时 读书: 代码: 作业: 博客: 一.学习目标 1. 能够独立安装Linux操作系统   2. 能够熟练使用Linux系统的基本命令   3. 熟练使用Linux中用户管理命令/ ...

  3. vim环境设置和自动对齐

    只要在 /etc/vimrc中加上这两句就行了set autoindentset smartindent------------------------------------------------ ...

  4. 报错:'Could not load NIB in bundle: 'NSBundle解决办法

    1.首先检查拼写是否正确: 2.断开连线,重新连接view与files' owner; 3.规避敏感View名.Xcode中有许多名字是系统预留的.你如果用了也会报这个错误.

  5. 安装VS2008无法更改安装路径解决方法

    一直用VS2012 以及 VS2012开发,但是他们都不支持Wince程序的开发,所有要安装VS2008.但是发现VS2008只能安装在C盘,要知道C空间很宝贵的. 经过查找资料发现系统中已经安装了V ...

  6. .net截取两个字符串中间的内容

    做模拟登录时,需要截取html代码中的名字,返回的字符串内容如下 <span class="welcome">您好<span style="font-s ...

  7. [codevs 1306]广播操的游戏(Trie)

    题目:http://codevs.cn/problem/1306/ 分析:题意一看就知道就是要求Trie有多少个节点.但是如果每次单独取原串的所有子串加入Trie会超时,为什么呢?比方说AAABBBC ...

  8. Ubuntu下vim的配置

    由于刚开始学习Linux,对佷多操作还不熟悉,遇到了一些困难,在这里记录一下. 1  安装vim.俺我现在的理解,vim有控制台版本和GUI版本.控制台版本貌似是Ubuntu自带的,可以在终端输入 v ...

  9. MyEclipse8.5快速搭建SSH框架

    来源于:http://jingyan.baidu.com/article/a378c960a78125b3282830cc.html MyEclipse8.5快速搭建SSH框架 使用版本: Strut ...

  10. session的一个问题

    <%@ page language="java" import="java.util.*,javax.servlet.http.Cookie.*" pag ...