nonatomic與atomic的區別與作用


之前只知道在聲明屬性的時候要用nonatomic與atomic這兩個關鍵字,但是具體的區別與作用還不是很理解,最近被問到,就做一下功課總結一下!希望對不是很理解的童鞋也有幫助!!

  1. atomic和nonatomic區別用來決定編譯器生成的getter和setter是否為原子操作。atomic提供多線程安全,是描述該變量是否支持多線程的同步訪問,如果選擇了atomic 那么就是說,系統會自動的創建lock鎖,鎖定變量。nonatomic禁止多線程,變量保護,提高性能。
  2. atomic:默認是有該屬性的,這個屬性是為了保證程序在多線程情況下,編譯器會自動生成一些互斥加鎖代碼,避免該變量的讀寫不同步問題。
  3. nonatomic:如果該對象無需考慮多線程的情況,請加入這個屬性,這樣會讓編譯器少生成一些互斥加鎖代碼,可以提高效率。
  4. atomic的意思就是setter/getter這個函數,是一個原語操作。如果有多個線程同時調用setter的話,不會出現某一個線程執行完setter全部語句之前,另一個線程開始執行setter情況,相當於函數頭尾加了鎖一樣,可以保證數據的完整性。nonatomic不保證setter/getter的原語行,所以你可能會取到不完整的東西。因此,在多線程的環境下原子操作是非常必要的,否則有可能會引起錯誤的結果。
  5. 比如setter函數里面改變兩個成員變量,如果你用nonatomic的話,getter可能會取到只更改了其中一個變量時候的狀態,這樣取到的東西會有問題,就是不完整的。當然如果不需要多線程支持的話,用nonatomic就夠了,因為不涉及到線程鎖的操作,所以它執行率相對快些。

       加了atomic的例子:

 

1                         {lock}
2                                 if (property != newValue) { 
3                                         [property release]; 
4                                         property = [newValue retain]; 
5                                 }
6                         {unlock}

可以看出來,用atomic會在多線程的設值取值時加鎖,中間的執行層是處於被保護的一種狀態,atomic是oc使用的一種線程保護技術,基本上來講,就是防止在寫入未完成的時候被另外一個線程讀取,造成數據錯誤。而這種機制是耗費系統資源的,所以在iPhone這種小型設備上,如果沒有使用多線程間的通訊編程,那么nonatomic是一個非常好的選擇。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM