在对象之外访问实例变量时,应该通过属性来做,然而在对象内部访问实例变量,强烈建议读取实例变量的时候通过直接访问的形式,而在设置实例变量的时候通过属性来做。
一 self.property 和_property 区别
直接访问实例变量,不经过OC 的 "方法派发" (下篇写),访问速度快,编译器生成的代码会直接访问保存对象实例变量的内存
直接访问实例变量,不会调用 设置方法,绕过了相关属性所定义的“内存管理语义”,例如在ARC 中,直接方法copy的属性,不会拷贝而是直接覆盖
直接访问实例变量,不会触发KVO
通过属性访问,可以设置断点调试
综合上面的情况:在写入实例变量时,通过 设置方法 来做,而在读取的时候 ,通过直接访问的方式。既可以提高读取操作速读,又能控制对属性的写入,保证相关属性的 "内存管理语义" 得以贯彻。
二 注意点
2.1 懒加载
懒加载的情况下,必须通过 获取方法 来访问属性,或者,实例变量不会别初始化
-(NSArray *)array{
if (!_array) {
_array = @[@"aa",@"bb"];
}
return _array;
}
2.2 不要在 init 和 dealloc 方法中使用 self.property
== 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函数中使用accessor
三 总结
在对象内部读取数据时,应该直接通过实例变量来读,在写入数据时,则应该通过属性来写
在初始化方法和 dealloc 方法中,应该直接通实例变量名直接来读写数据,避免用self.property访问
使用懒加载时,需要通过属性来读取数据