atomic : 變量默認是有該有屬性的,這個屬性是為了保證在多線程的情況下,編譯器會自動生成一些互斥加鎖的代碼,避免該變量的讀寫不同步的問題。
nonatomic : 如果該對象無需考慮多線程的情況,這個屬性會讓編譯器少生成一些互斥代碼,可以提高效率。
atomic 的意思是setter/getter 這個函數,是一個原語操作,如果有多個線程同時調用setter的話,不會出現某一個線程執行完setter全部語句之前,另一個線程開始執行setter情況,相當於函數頭尾加了鎖一樣,可以保證數據的完整性。nonatamic 不保證setter/getter 的原語行,所以你可能會取到不完整的東西。因此,在多線程的環境下的原子操作是非常必要的,狗有可能會引起錯誤的結果。
比如setter函數里改變了兩個成員變量,如果你用nonatomic的話,getter 可能會取到只更改了其中一個變量時候的狀態,這樣取到的東西會有問題,就是不完整的。當然如果不需要多線程支持的話,用nonatomic就夠了,因為不涉及到線程鎖的操作,所以它執行效率相對快些。
例如加了atomic的例子:
{lock}
if(proprity!=newValue){
[property release];
property = [newValue retain];
}
{unlock}
所以,atomic 會在多線程設值取值的時候加鎖,中間的執行層是處於被保護的一種狀態,atomic 是oc使用的一種線程保護技術,基本上講,就是防止在寫入未完成的時候被另外一個線程讀取,造成數據錯誤。而這種機制是耗費系統資源的,所以在iPhone這種小型設備上,如果沒有使用多線程間的通訊編程,那么nonatomic是一個非常好的選擇!
更過的進階技術可以關注公眾號:進階的腳步 回復:學習資料 有驚喜哦