IOS OC 对象内部尽可能直接访问实例变量

在对象以外访问实例变量时,应该经过属性来作,然而在对象内部访问实例变量,强烈建议读取实例变量的时候经过直接访问的形式,而在设置实例变量的时候经过属性来作。函数


一 self.property 和_property 区别

  • 直接访问实例变量,不通过OC 的 "方法派发" (下篇写),访问速度快,编译器生成的代码会直接访问保存对象实例变量的内存spa


  • 直接访问实例变量,不会调用 设置方法,绕过了相关属性所定义的“内存管理语义”,例如在ARC 中,直接方法copy的属性,不会拷贝而是直接覆盖调试


  • 直接访问实例变量,不会触发KVOcode


  • 经过属性访问,能够设置断点调试对象


综合上面的状况:在写入实例变量时,经过 设置方法 来作,而在读取的时候 ,经过直接访问的方式。既能够提升读取操做速读,又能控制对属性的写入,保证相关属性的 "内存管理语义" 得以贯彻。blog


二 注意点

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函数中使用accessorget



三 总结

在对象内部读取数据时,应该直接经过实例变量来读,在写入数据时,则应该经过属性来写编译器

在初始化方法和 dealloc 方法中,应该直接通实例变量名直接来读写数据,避免用self.property访问it

使用懒加载时,须要经过属性来读取数据

相关文章
相关标签/搜索