iOS atomic 與 nonatomic 區(qū)別

atomic : ?變量默認(rèn)是有該有屬性的,這個屬性是為了保證在多線程的情況下,編譯器會自動生成一些互斥加鎖的代碼,避免該變量的讀寫不同步的問題?! ?/p>

nonatomic ?: 如果該對象無需考慮多線程的情況,這個屬性會讓編譯器少生成一些互斥代碼,可以提高效率。

atomic 的意思是setter/getter

這個函數(shù),是一個原語操作,如果有多個線程同時調(diào)用setter的話,不會出現(xiàn)某一個線程執(zhí)行完setter全部語句之前,另一個線程開始執(zhí)行setter情況,相當(dāng)于函數(shù)頭尾加了鎖一樣,可以保證數(shù)據(jù)的完整性。nonatamic

不保證setter/getter

的原語行,所以你可能會取到不完整的東西。因此,在多線程的環(huán)境下的原子操作是非常必要的,狗有可能會引起錯誤的結(jié)果。

比如setter函數(shù)里改變了兩個成員變量,如果你用nonatomic的話,getter

可能會取到只更改了其中一個變量時候的狀態(tài),這樣取到的東西會有問題,就是不完整的。當(dāng)然如果不需要多線程支持的話,用nonatomic就夠了,因為不涉及到線程鎖的操作,所以它執(zhí)行效率相對快些。

例如加了atomic的例子:

{lock}

if(proprity!=newValue){

  [property release];

  property = [newValue retain];

}

{unlock}

所以,atomic 會在多線程設(shè)值取值的時候加鎖,中間的執(zhí)行層是處于被保護(hù)的一種狀態(tài),atomic

是oc使用的一種線程保護(hù)技術(shù),基本上講,就是防止在寫入未完成的時候被另外一個線程讀取,造成數(shù)據(jù)錯誤。而這種機(jī)制是耗費(fèi)系統(tǒng)資源的,所以在iPhone這種小型設(shè)備上,如果沒有使用多線程間的通訊編程,那么nonatomic是一個非常好的選擇!

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

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

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