常見場(chǎng)景
在定義 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)鍵字只起提示作用,寫不寫都一樣。對(duì)于atomic的屬性,系統(tǒng)生成的 getter/setter 會(huì)保證 get、set 操作的完整性,不受其他線程影響。比如,線程 A 的 getter 方法運(yùn)行到一半,線程 B 調(diào)用了 setter:那么線程 A 的 getter 還是能得到一個(gè)完好無損的對(duì)象。不過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];
}
}