常見的修飾iOS變量屬性的atomic與nonatomic關(guān)鍵字砍聊,這兩個(gè)關(guān)鍵字有何作用?
我經(jīng)撤【看到的結(jié)論是atomic是線程安全的玻蝌,保證對(duì)屬性操作的原子性词疼。當(dāng)然這樣付出額外的性能代價(jià)俯树,所以atomic并不常用。nonatomic不提供原子性保證寒跳,自然也就沒有性能方面的代價(jià)聘萨。所以通常修飾屬性用的是nonatomic。但是何時(shí)使用atomic呢童太?atomic的用武之地是什么米辐?apple設(shè)計(jì)這個(gè)關(guān)鍵字有何意義?
順利成章的书释,我想到了翘贮,也許是在多個(gè)線程操作某個(gè)屬性的時(shí)候,使用atomic可以保證原子性操作爆惧,從而不需要其他的同步措施狸页,我認(rèn)為這樣的是合理的。并且我一直這么認(rèn)為扯再,直到有一天我親自試了一下芍耘,發(fā)現(xiàn)根本不是這樣的,多線程操作某個(gè)使用atomic關(guān)鍵字修飾的屬性的時(shí)候熄阻,如果不采取額外的同步措施斋竞,結(jié)果依然是無法預(yù)料的。于是我產(chǎn)生了疑惑秃殉,原子性到底是什么意思坝初?
為此浸剩,我特意將OC代碼通過Clang編譯器處理輸出了Cpp代碼,一共生成了兩份代碼鳄袍,一份是atomic關(guān)鍵字修飾绢要,一份是nonatomic關(guān)鍵字修飾,目的就是為了對(duì)比生成set方法有何卻別拗小。我寫了個(gè)簡(jiǎn)單的類如下:
@interface myClass : NSObject
@property(atomic, assign) int age;
@end
這個(gè)類生成的Cpp代碼如下(這里只列出關(guān)鍵的代碼):
static int _I_myClass_age(myClass * self, SEL _cmd) { return (*(int *)((char *)self + OBJC_IVAR_$_myClass$_age)); }
static void _I_myClass_setAge_(myClass * self, SEL _cmd, int age) { (*(int *)((char *)self + OBJC_IVAR_$_myClass$_age)) = age; }
下面是nonatomic關(guān)鍵字修飾的代碼:
@interface myClass : NSObject
@property(nonatomic, assign) int age;
@end
clang輸出的cpp代碼如下:
static int _I_myClass_age(myClass * self, SEL _cmd) { return (*(int *)((char *)self + OBJC_IVAR_$_myClass$_age)); }
static void _I_myClass_setAge_(myClass * self, SEL _cmd, int age) { (*(int *)((char *)self + OBJC_IVAR_$_myClass$_age)) = age; }
通過詳細(xì)對(duì)比重罪,我發(fā)現(xiàn)atomic與nonatomic關(guān)鍵字生成的代碼基本一致,
也許我找的關(guān)鍵代碼片段不對(duì)十籍?還是別的原因蛆封?反正,在多線程場(chǎng)景下勾栗,atomic關(guān)鍵字不能夠保證同步訪問惨篱。如果有人知道這兩個(gè)關(guān)鍵字的真實(shí)意義,還請(qǐng)不吝賜教围俘。