atomic和nonatomic

常見場(chǎng)景

在定義 property 的時(shí)候,atomic和nonatomic有何區(qū)別?

1.@property(nonatomic, retain) UITextField *userName;
2.@property(atomic, retain) UITextField *userName;
3.@property(retain) UITextField *userName;

答案:2,3行是一樣的,不寫的話默認(rèn)就是atomic。atomic 和 nonatomic 的區(qū)別在于,系統(tǒng)自動(dòng)生成的 getter/setter 方法不一樣。如果你自己寫 getter/setter,那 atomic/nonatomic/retain/assign/copy 這些關(guān)鍵字只起提示作用,寫不寫都一樣。對(duì)于atomic的屬性,系統(tǒng)生成的 getter/setter 會(huì)保證 get、set 操作的完整性,不受其他線程影響。比如,線程 A 的 getter 方法運(yùn)行到一半,線程 B 調(diào)用了 setter:那么線程 A 的 getter 還是能得到一個(gè)完好無損的對(duì)象。不過atomic可并不能保證線程安全。如果線程 A 調(diào)了 getter,與此同時(shí)線程 B 、線程 C 都調(diào)了 setter——那最后線程 A get 到的值,3種都有可能:可能是 B、C set 之前原始的值,也可能是 B set 的值,也可能是 C set 的值。同時(shí),最終這個(gè)屬性的值,可能是 B set 的值,也有可能是 C set 的值。

代碼回答:

//@property(nonatomic, retain) UITextField *userName;
//系統(tǒng)生成的代碼如下:
- (UITextField *)userName {   
  return userName;
}
- (void)setUserName:(UITextField *)userName_ {   
 [userName_ retain];   
 [userName release];
userName =userName_;
}
@property(retain) UITextField *userName;
//系統(tǒng)生成的代碼如下:
- (UITextField*) userName {
UITextField*retval =nil;
@synchronized(self)
   {        
     retval = [[userName  retain]  autorelease];    
   }
return  retval;
}
- (void) setUserName:(UITextField*)userName_ {
    @synchronized(self) {      
     [userName release];     
      userName = [userName_  retain];    
     }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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