nonatomic:非原子的萌庆,非線程安全的斥扛,適合內(nèi)存小的移動(dòng)設(shè)備
atomic:原子的,線程安全的
不寫的話默認(rèn)就是atomic食茎,atomic 和 nonatomic 的區(qū)別在于蒂破,系統(tǒng)自動(dòng)生成的 getter/setter 方法不一樣。如果你自己寫 getter/setter别渔,那 atomic/nonatomic/retain/assign/copy 這些關(guān)鍵字只起提示作用附迷,寫不寫都一樣
-
一般iOS程序中,所有屬性都聲明為nonatomic
這樣做的原因是:在iOS中使用同步鎖的開銷比較大哎媚, 這會(huì)帶來(lái)性能問(wèn)題喇伯。一般情況下并不要求屬性必須是“原子的”,因?yàn)閍tomic并不能保證“線程安全”(thread safety)拨与,若要實(shí)現(xiàn)“線程安全”的操作稻据,還需采用更為深層的鎖定機(jī)制才行。
例如:一個(gè)線程在連續(xù)多次讀取某個(gè)屬性值的過(guò)程中有別的線程在同時(shí)改寫該值买喧,那么即便將屬性聲明為atomic捻悯,也還是會(huì)讀取到不同的屬性值。
原因如下:
假設(shè)有一個(gè) atomic 的屬性 "name"淤毛,如果線程 A 調(diào)[self setName:@"A"]秋度,線程 B 調(diào)[self setName:@"B"],線程 C 調(diào)[self name]钱床,那么所有這些不同線程上的操作都將依次順序執(zhí)行——也就是說(shuō)荚斯,如果一個(gè)線程正在執(zhí)行 getter/setter,其他線程就得等待查牌。因此事期,屬性 name 是讀/寫安全的。
但是纸颜,如果有另一個(gè)線程 D 同時(shí)在調(diào)[name release]兽泣,那可能就會(huì)crash,因?yàn)?release 不受 getter/setter 操作的限制胁孙。
atomic屬性只能說(shuō)是讀/寫安全的唠倦,但并不是線程安全的,因?yàn)閯e的線程還能進(jìn)行讀寫之外的其他操作涮较。線程安全需要開發(fā)者自己來(lái)保證稠鼻。