在对象以外访问实例变量时,应该经过属性来作,然而在对象内部访问实例变量,强烈建议读取实例变量的时候经过直接访问的形式,而在设置实例变量的时候经过属性来作。函数
直接访问实例变量,不通过OC 的 "方法派发" (下篇写),访问速度快,编译器生成的代码会直接访问保存对象实例变量的内存spa
直接访问实例变量,不会调用 设置方法,绕过了相关属性所定义的“内存管理语义”,例如在ARC 中,直接方法copy的属性,不会拷贝而是直接覆盖调试
直接访问实例变量,不会触发KVOcode
经过属性访问,能够设置断点调试对象
综合上面的状况:在写入实例变量时,经过 设置方法 来作,而在读取的时候 ,经过直接访问的方式。既能够提升读取操做速读,又能控制对属性的写入,保证相关属性的 "内存管理语义" 得以贯彻。blog
懒加载的状况下,必须经过 获取方法 来访问属性,或者,实例变量不会别初始化内存
-(NSArray *)array{ if (!_array) { _array = @[@"aa",@"bb"]; } return _array; }
== init -(id)init { self = [super init]; if (self) { _count = [[NSNumber alloc] initWithInteger:0]; } return self; } == dealloc - (void)dealloc { [_count release]; [super dealloc]; }
在 init 和 dealloc 中,对象的存在与否还不肯定,因此给对象发消息可能不会成功。请详细查看 巧哥这篇 不要在init和dealloc函数中使用accessorget
在对象内部读取数据时,应该直接经过实例变量来读,在写入数据时,则应该经过属性来写编译器
在初始化方法和 dealloc 方法中,应该直接通实例变量名直接来读写数据,避免用self.property访问it
使用懒加载时,须要经过属性来读取数据