在对象内部尽量直接访问实例变量

本文概要:

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方法来访问属性,否则,实例变量就永远不会初始化。

posted @ 2018-04-23 14:14  码出境界  阅读(353)  评论(0编辑  收藏  举报