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