atomic和nonatomic區(qū)別用來決定編譯器生成的getter和setter是否為原子操作囤耳。atomic提供多線程安全,是描述 該變量是否支持多線程的同步訪問挑围,如果選擇了atomic 那么就是說,系統(tǒng)會自動的創(chuàng)建lock鎖,鎖定變量。nonatomic禁止多線程,變量保護(hù)著隆,提高性能。
atomic:默認(rèn)是有該屬性的呀癣,這個(gè)屬性是為了保證程序在多線程情況下美浦,編譯器會自動生成一些互斥加鎖代碼,避免該變量的讀寫不同步問題项栏。
nonatomic:如果該對象無需考慮多線程的情況浦辨,請加入這個(gè)屬性,這樣會讓編譯器少生成一些互斥加鎖代碼,可以提高效率流酬。
atomic的意思就是setter/getter這個(gè)函數(shù)币厕,是一個(gè)原語操作。如果有多個(gè)線程同時(shí)調(diào)用setter的話芽腾,不會出現(xiàn)某一個(gè)線程執(zhí)行完setter全部語句之前旦装,另一個(gè)線程開始執(zhí)行setter情況,相當(dāng)于函數(shù)頭尾加了鎖一樣摊滔,可以保證數(shù)據(jù)的完整性阴绢。
nonatomic不保證setter/getter的原語行,所以你可能會取到不完整的東西艰躺。因此呻袭,在多線程的環(huán)境下原子操作是非常必要的,否則有可能會引起錯誤的結(jié)果
比如setter函數(shù)里面改變兩個(gè)成員變量腺兴,如果你用nonatomic的話左电,getter可能會取到只更改了其中一個(gè)變量時(shí)候的狀態(tài),這樣取到的東西會有問題页响,就是不完整的篓足。
當(dāng)然如果不需要多線程支持的話,用nonatomic就夠了闰蚕,因?yàn)椴簧婕暗骄€程鎖的操作纷纫,所以它執(zhí)行率相對快些。