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

302 阅读1分钟
  • 在对象内部读取数据时,应该直接通过实例变量来读,而写入数据时,应该通过属性来写。
  • 在初始化方法及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。
  • 通过属性来访问有助于排查与之相关的错误。断点调试。