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

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


一 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访问

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


转载于:https://my.oschina.net/wolx/blog/472942

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值