亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

原子屬性和非原子屬性有什么區別?

原子屬性和非原子屬性有什么區別?

iOS
冉冉說 2019-05-31 16:43:07
原子屬性和非原子屬性有什么區別?做什么atomic和nonatomic財產申報中的意思?@property(nonatomic, retain) UITextField *userName;@property(atomic, retain) UITextField *userName;@property(retain) UITextField *userName;這三者在運作上有何分別?
查看完整描述

3 回答

?
慕斯王

TA貢獻1864條經驗 獲得超2個贊

這在蘋果的文獻資料下面是一些實際發生的事情的例子。請注意,沒有“原子”關鍵字,如果不指定“非原子”,則屬性是原子的,但是顯式地指定“原子”將導致錯誤。

//@property(nonatomic, retain) UITextField *userName;//Generates roughly- (UITextField *) userName {
    return userName;}- (void) setUserName:(UITextField *)userName_ {
    [userName_ retain];
    [userName release];
    userName = userName_;}

現在,原子變體稍微復雜一點:

//@property(retain) UITextField *userName;//Generates roughly- (UITextField *) userName {
    UITextField *retval = nil;
    @synchronized(self) {
        retval = [[userName retain] autorelease];
    }
    return retval;}- (void) setUserName:(UITextField *)userName_ {
    @synchronized(self) {
      [userName_ retain];
      [userName release];
      userName = userName_;
    }}

基本上,為了確保線程安全,原子版本必須使用鎖,還需要將ref計數加在對象上(以及自動釋放計數以平衡對象),以便保證調用方存在對象,否則,如果另一個線程正在設置該值,則會出現一個潛在的爭用條件,從而導致ref計數下降到0。

實際上,根據屬性是標量值還是對象,以及保留、復制、只讀、非原子等交互作用,這些東西的工作方式有很多不同的變體。一般來說,屬性合成器只知道如何為所有組合做“正確的事情”。


查看完整回答
反對 回復 2019-05-31
?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

原子

  • 是默認行為。
  • 將確保當前進程在另一個進程訪問變量之前由cpu完成。
  • 不是快速的,因為它確保了整個過程的完成。

非原子

  • 不是默認行為。
  • 更快(用于合成代碼,也就是使用@Property和@合成創建的變量)
  • 非線程安全
  • 當兩個不同的進程同時訪問同一個變量時,可能會導致意外行為。


查看完整回答
反對 回復 2019-05-31
  • 3 回答
  • 0 關注
  • 882 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號