我们知道,在对象与对象间如果要访问实例变量的话总是通过属性来实现的。那么在对象内部对实例变量的访问是怎样的呢?最好是 在读取实例变量的时候直接使用实例变量,在设置实例变量的时候通过属性来完成 至于为什么这样做,可以做如下几点解释。
- 因为不通过Objective-C的方法派发(method dispatch),所以直接访问实例变量的速度比较快。因为这种情况下,编译器所生成的代码会直接访问保存对象实例变量的那块内存。
- 直接访问实例变量时候,不会调用其”设置方法”,这样就绕过了相关属性所定义的“内存管理语义”。例如在ARC下直接访问一个声明为copy的属性,那么并不会拷贝该属性,只会保留新值并释放旧值。
- 直接访问实例变量,不会触发键值观测(key-value observing)
- 通过属性访问有助于排插预支相关的错误。因为可以在setter和getter方法中添加断点。
所以,在写入实例变量时候,通过setter方法来做,而在读取实例变量时候,则直接访问。这样技能提高读取操作的速度,又能控制对属性的写入操作。
还有一个要注意的地方是, 在初始化方法汇总设置属性值时,应该总是直接访问实例变量,因为1.如果直接使用属性访问,这时候有可能实例变量并没有初始化完成,我们使用属性进行存取,也是基于实例变量的访问实现的,在初始化方法中使用属性是不妥的,因为并不能确定相对应的实例变量是否已经初始化完成。2.子类可能复写setter方法。比如,在基类中定义了属性,但是没有主动实现setter方法,但是如果子类复写了该属性的setter方法,那么在基类初始化属性的时候调用setter方法则会调用子类的setter方法。但是在某些情况下还是会出现使用属性来设置实例变量,这种情况是基类中的属性,在子类中想要直接访问实例变量的话,只能通过.方法来调用了。