當(dāng)討論到property多線程安全的時(shí)候僵驰,很多人都知道給property加上atomic attribute之后想际,可以一定程度的保障多線程安全划栓。
但是這個(gè)其實(shí)是存在誤區(qū)的呢撞,設(shè)置atomic后损姜,只是默認(rèn)的生成getter和setter方法執(zhí)行是原子的,只能保證多線程中執(zhí)行g(shù)etter和setter方法是線程安全的殊霞,但是實(shí)際上很多時(shí)候是執(zhí)行g(shù)etter后需要對(duì)變量做處理摧阅,這個(gè)時(shí)候就會(huì)出問(wèn)題。
上面這段代碼就會(huì)出現(xiàn)閃退绷蹲,因?yàn)閟elf.atomicProperty.length是原子的棒卷,這個(gè)時(shí)候如果是@“1234567890”,進(jìn)入到if中后祝钢,值可能會(huì)變?yōu)锧“123”比规,導(dǎo)致閃退。
為了避免上面這種多線程訪問(wèn)和寫入的問(wèn)題拦英,如果訪問(wèn)只是簡(jiǎn)單的訪問(wèn)時(shí)蜒什,可以用一個(gè)局部變量接收一下,或者通過(guò)代碼塊加鎖的方式來(lái)避免疤估,如下:
不過(guò)由于atomic速度不快灾常,所以如果不會(huì)多線程中操作的話,盡量還是使用nonatomic修飾铃拇。
另外之前看到有人問(wèn):系統(tǒng)默認(rèn)的是atomic的钞瀑,為什么大多時(shí)候都是使用nonatomic?
看到有個(gè)大神的解釋是:理論上如果沒(méi)有特殊要求的話慷荔,iOS用nonatomic比較好雕什,而OSX用atomic比較好。如果不寫的話,系統(tǒng)按照相對(duì)比較安全的atomic處理监徘。iOS用nonatomic主要是出于性能考慮晋修,OSX上性能不是瓶頸,所以就不用了凰盔。