在iOS中,如果一個屬性沒有聲明是nonatomic還是atomic,那么它默認是atomic。
nonatomic不保證原子性,當一個屬性聲明為nonatomic的時候,訪問這個屬性的時候速度會很快,但是這個屬性不是線程安全的,同時如果一個線程在訪問屬性的get方法,另外一個線程在訪問屬性的set方法,那么如果set方法沒有調(diào)用完成,get方法獲得的值可能是錯誤的
atomic是屬性默認的,它的速度并不快,因為在它的內(nèi)部加入了鎖來保證set活著get方法的完整性,比如一個線程在調(diào)用set方法的時候另外一個線程的get方法必須等待當前線程的set方法調(diào)用完畢之后才能調(diào)用。atomic雖然保證的set和get方法的完整性,但是它并不是線程安全的,因為atomic只是保證了讀寫方法的完整性,但是一個屬性除了讀寫方法還有另外的方法,比如release,所以nonatomic和atomic的區(qū)別就是在于set和get方法的區(qū)別
代碼
//nonatomic系統(tǒng)生成的代碼如下:
- (UITextField *) userName {
return userName;
}
- (void) setUserName:(UITextField *)userName_ {
[userName_ retain];
[userName release];
userName = userName_;
}
//atomic系統(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];
}
}