07@在对象内部尽量直接访问实例变量

本文探讨了在Objective-C中如何正确使用属性和实例变量进行数据读写,强调了初始化和dealloc方法中直接使用实例变量的重要性,以及在惰性初始化等场景下使用属性的好处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 在对象内部读取数据时,应该直接通过实例变量来读,而写入数据时,应该通过属性来写。
  • 在初始化方法及dealloc方法中,总是应该直接通过实例变量来读写数据。
/// 初始化方法中使用实例变量来读写数据
-(id)initWithFirstName: (NSString *)firlstName
              lastName:(NSString *) lastName {
    if (self = [super init]) {
        _firstName = [firstName copy]
        _lastName = [lastName copy] // 推荐用copy
    }
    return self
}
 
/// 通过实例变量来读
-(NSString *)fullName{
    return [NSStringstringWithFormat:@"%@ %@", _firstName, _lastName]
}

/// 通过属性访问来赋值
-(void)setLastName:(NSString*)lastName {
    self.lastName = lastName
}
复制代码
  • 有时使用惰性初始化技术配置某份数据,这种情况下,需要通过属性来读取数据。
/// 惰性初始化,需要使用属性来读取数据,直接实例变量会看到未设置好的brain。
-(EOCBrain *)brain {
    if (!_brain) {
        _brain = [Brain new]
    }
    return _brain
}

复制代码

通过属性访问与直接范文区别

  • 直接访问实例变量,不需要经过方法派发,速度较快,因为会直接访问保存对象实例变量的那块内存地址。
  • 直接访问实例变量,不会调用“设置方法”,绕过了为相关属性所定义的“内存管理语义”。例如copy,不会拷贝,只会保留新值并释放旧值。
  • 直接访问实例变量不会触发KVO。
  • 通过属性来访问有助于排查与之相关的错误。断点调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值