07@在物件內部儘量直接訪問例項變數

Zack_Go發表於2019-01-05
  • 在物件內部讀取資料時,應該直接通過例項變數來讀,而寫入資料時,應該通過屬性來寫。
  • 在初始化方法及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。
  • 通過屬性來訪問有助於排查與之相關的錯誤。斷點除錯。

相關文章