Item 7 訪問數(shù)據(jù)`_`和`.`注意項

Item 7 訪問數(shù)據(jù)_.注意項

access變量時的在內(nèi)部直接訪問的區(qū)別,先看一個例子:

//convience methods
- (NSString *) fullName {
  return [NSString stringWithFormat:@"%@%@", self.firstName,self.lastName];
}
- (void)setFullName:(NSString*)fullName{
  NSArray * components = [fullName componentsSeperatedByString:@""];
  self.firstName = [components objectAtIndex:0];
  self.lastName = [components objecteAtIndex:1];
}

上例中,我們通過accessor來access實例變量,用到了屬性的.表達式,假設(shè)你這樣重寫這兩個方法直接access實例變量

- (NSString *)fullName{
  return [NSString stringWithFormat:@"%@%@",_fistName,_lastName];
}
-(void) setFullName:(NSString *)fullName{
  NSArray * components = [fullName componentsSeperateByString:@" "];
  _firstName = [components objectAtIndex:0];
  _latsName = [components objectAtIndex:1];
}

倆中方法區(qū)別:

  1. 直接訪問速度上肯定會快些,因為不需要調(diào)用oc方法

  2. 直接訪問繞過了屬性的setter內(nèi)存管理語法,例如如果你的屬性定義為copy,直接設(shè)置實例變量不會生成一個copy,新值被保留,舊值被釋放掉

  3. KVO 通知不會失效, 還不懂KVO

  4. 通過accessor來access屬性在調(diào)試時會容易些,可以直接設(shè)置setter getter 斷點

在初始化方法中設(shè)置值時,通常應該使用直接access的方式, 假設(shè)EOCPerson有一個子類EOCSmithPerson, 子類可能重寫setter方法:

- (void)setLastName:(NSString*)lastName{
  if(![lastName isEqualToString @"Smith"]) {
    [NSException raise:NSInvalidArgumentException format:@"Last name must be Smith"];
  }
  self.lastName = lastName;
}

基類EOCPerson可能會在默認的初始化方法中把lastName設(shè)置為空,如果通過setter方法設(shè)置的,那么會調(diào)用到子類的setter方法,并且拋出異常。當然,有些情況如實例變量在父類中聲明的,你不能直接access到實例變量,你必須使用setter。

在使用lazy 初始化時,則必須通過getter 來access變量,如果不通過getter,實例變量可能沒有機會初始化。例如EOCPerson可能有一個屬性brain,如果這個屬性經(jīng)常被訪問到,但是設(shè)置值可能帶來很重的開銷,你可以在getter中延遲初始化這個值:

-(EOCBrain *) brain {
  if(!_brain){
    _brain = [Brain new];
  }
  return _brain;
}

如果直接訪問brain可能getter還沒有調(diào)用,brain可能就還沒設(shè)置好。

總結(jié)

  1. 建議內(nèi)部訪問時通過直接讀取實例變量(以_方式訪問),設(shè)置變量值時通過setter
  2. 在初始化方法和dealloc中,讀寫最好通過_方法
  3. 某些場景(如lazy)讀數(shù)據(jù)建議通過getter方法
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學習記錄文檔,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 3,125評論 2 9
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,634評論 1 32
  • 早上語文課進行歇會語比賽,表現(xiàn)還不錯。就是普通話退化好厲害。 中午不午覺完成了一幅畫,下午的課‘幼兒急救’拿著一個...
    逆風追夢人閱讀 151評論 0 0
  • 有這樣一個人 其他人眼中的他也許平凡到平庸 可是對于我而言呀 他的每一張照片、每一句語音、 每一段文字、每一種心情...
    開開吧閱讀 357評論 0 0
  • 今天睡到了十一點多才起來,好累啊。在哥哥這里,是我做飯,頭暈,她們都不做飯。整得滿頭都是油,好想我們家男神。他在我...
    依米花Erin閱讀 98評論 0 0

友情鏈接更多精彩內(nèi)容