常見場景
在定義 property 的時(shí)候蝶棋,atomic和nonatomic有何區(qū)別赐稽?
1.@property(nonatomic, retain) UITextField *userName;
2.@property(atomic, retain) UITextField *userName;
3.@property(retain) UITextField *userName;
答案:2,3行是一樣的党瓮,不寫的話默認(rèn)就是atomic详炬。atomic 和 nonatomic 的區(qū)別在于,系統(tǒng)自動(dòng)生成的 getter/setter 方法不一樣寞奸。如果你自己寫 getter/setter呛谜,那 atomic/nonatomic/retain/assign/copy 這些關(guān)鍵字只起提示作用,寫不寫都一樣枪萄。對于atomic的屬性隐岛,系統(tǒng)生成的 getter/setter 會(huì)保證 get、set 操作的完整性呻引,不受其他線程影響礼仗。比如,線程 A 的 getter 方法運(yùn)行到一半,線程 B 調(diào)用了 setter:那么線程 A 的 getter 還是能得到一個(gè)完好無損的對象元践。不過atomic可并不能保證線程安全韭脊。如果線程 A 調(diào)了 getter,與此同時(shí)線程 B 单旁、線程 C 都調(diào)了 setter——那最后線程 A get 到的值沪羔,3種都有可能:可能是 B、C set 之前原始的值象浑,也可能是 B set 的值蔫饰,也可能是 C set 的值。同時(shí)愉豺,最終這個(gè)屬性的值篓吁,可能是 B set 的值,也有可能是 C set 的值蚪拦。
代碼回答:
//@property(nonatomic, retain) UITextField *userName;
//系統(tǒng)生成的代碼如下:
- (UITextField *)userName {
return userName;
}
- (void)setUserName:(UITextField *)userName_ {
[userName_ retain];
[userName release];
userName =userName_;
}
@property(retain) UITextField *userName;
//系統(tǒng)生成的代碼如下:
- (UITextField*) userName {
UITextField*retval =nil;
@synchronized(self)
{
retval = [[userName retain] autorelease];
}
return retval;
}
- (void) setUserName:(UITextField*)userName_ {
@synchronized(self) {
[userName release];
userName = [userName_ retain];
}
}