本文概要:
1、首先给出结论是:除了几种特殊情况外,在读取实例变量的时候采用直接访问的形式,而在设置实例变量的时候通过属性来做。
2、讲解了使用getter、setter的好处。
3、列举了几种上面提到的特殊情况:有时不能使用setter、有时必须使用setter、有时必须使用getter。
注意:在对象之外访问实例变量时总是应该通过属性来做。
一、除了几种特殊情况外,在读取实例变量的时候采用直接访问的形式,而在设置实例变量的时候通过属性来做。
读取时-直接访问: _oldName
设置时-属性访问:self.newName
也就是:self.newName = _oldName;
二、讲解了使用getter、setter的好处
- 由于不经过OC的方法派发步骤,所以直接访问实例变量的速度当然比较快。在这种情况下,编译器所产生的代码会直接访问保存对象实例变量的那块内存。
- 直接访问实例变量时,不会调用其setter方法,这就绕过了为相关属性所定义的“内存管理语义”。比方说,如果在ARC下直接访问一个声明为copy的属性,那么并不会拷贝该属性,只会保留新值并释放旧值。
- 如果直接访问实例变量,那么就不会触发KVO通知。
- 通过属性来访问有助于排查与之相关的错误,因为可以给getter和setter方法中增加断点,监控该属性的调用者及其访问时机。
因此就引出了本文最开始讲到的折中方案:
在写入实例变量时,通过其setter方法来做,而在读取实例变量时,则直接访问。此方法既能提高读写操作的速度,又能控制对属性的写入操作。之所以要通过setter方法来写入实例变量,其首要原因在于,这样做能够确保相关属性的“内存管理语义”得以贯彻。
三、有时不能使用setter、有时必须使用setter、有时必须使用getter
1、有时不能使用setter的情景:
在初始化方法中总是应该直接访问实例变量。
2、有时必须使用setter的情景:
如果待初始化的实例变量声明在超类中,而我们又无法在子类中直接访问此实例变量的话,那么就需要调用setter方法了。
3、有时必须使用getter的情景:
如果使用的是懒加载的方式来初始化实例变量的,必须通过getter方法来访问属性,否则,实例变量就永远不会初始化。