第一種
atomic和nonatomic區(qū)別用來決定編譯器生成的getter和setter是否為原子操作。atomic提供多線程安全,是描述該變量是否支持多線程的同步訪問,如果選擇了atomic 那么就是說,系統(tǒng)會自動的創(chuàng)建lock鎖,鎖定變量。nonatomic禁止多線程,變量保護,提高性能。
atomic:默認(rèn)是有該屬性的,這個屬性是為了保證程序在多線程情況下,編譯器會自動生成一些互斥加鎖代碼,避免該變量的讀寫不同步問題。
nonatomic:如果該對象無需考慮多線程的情況,請加入這個屬性,這樣會讓編譯器少生成一些互斥加鎖代碼,可以提高效率。
atomic的意思就是setter/getter這個函數(shù),是一個原語操作。如果有多個線程同時調(diào)用setter的話,不會出現(xiàn)某一個線程執(zhí)行完setter全部語句之前,另一個線程開始執(zhí)行setter情況,相當(dāng)于函數(shù)頭尾加了鎖一樣,可以保證數(shù)據(jù)的完整性。nonatomic不保證setter/getter的原語行,所以你可能會取到不完整的東西。因此,在多線程的環(huán)境下原子操作是非常必要的,否則有可能會引起錯誤的結(jié)果。
比如setter函數(shù)里面改變兩個成員變量,如果你用nonatomic的話,getter可能會取到只更改了其中一個變量時候的狀態(tài),這樣取到的東西會有問題,就是不完整的。當(dāng)然如果不需要多線程支持的話,用nonatomic就夠了,因為不涉及到線程鎖的操作,所以它執(zhí)行率相對快些。
下面是載錄的網(wǎng)上一段加了atomic的例子:
{lock}
if (property != newValue) {
[property release];
property = [newValue retain];
}
{unlock}
可以看出來,用atomic會在多線程的設(shè)值取值時加鎖,中間的執(zhí)行層是處于被保護的一種狀態(tài),atomic是oc使用的一種線程保護技術(shù),基本上來講,就是防止在寫入未完成的時候被另外一個線程讀取,造成數(shù)據(jù)錯誤。而這種機制是耗費系統(tǒng)資源的,所以在iPhone這種小型設(shè)備上,如果沒有使用多線程間的通訊編程,那么nonatomic是一個非常好的選擇。
第二種
atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。
atomic
設(shè)置成員變量的@property屬性時,默認(rèn)為atomic,提供多線程安全。
在多線程環(huán)境下,原子操作是必要的,否則有可能引起錯誤的結(jié)果。加了atomic,setter函數(shù)會變成下面這樣:
{lock}
if (property != newValue) {
[property release];
property = [newValue retain];
}
{unlock}
nonatomic
3禁止多線程,變量保護,提高性能。
3atomic是Objc使用的一種線程保護技術(shù),基本上來講,是防止在寫未完成的時候被另外一個線程讀取,造成數(shù)據(jù)錯誤。而這種機制是耗費系統(tǒng)資源的,所以在iPhone這種小型設(shè)備上,如果沒有使用多線程間的通訊編程,那么nonatomic是一個非常好的選擇。
3指出訪問器不是原子操作,而默認(rèn)地,訪問器是原子操作。這也就是說,在多線程環(huán)境下,解析的訪問器提供一個對屬性的安全訪問,從獲取器得到的返回值或者通過設(shè)置器設(shè)置的值可以一次完成,即便是別的線程也正在對其進行訪問。如果你不指定 nonatomic ,在自己管理內(nèi)存的環(huán)境中,解析的訪問器保留并自動釋放返回的值,如果指定了 nonatomic ,那么訪問器只是簡單地返回這個值。