在iOS中,如果一個屬性沒有聲明是nonatomic還是atomic趴生,那么它默認(rèn)是atomic阀趴。
nonatomic不保證原子性,當(dāng)一個屬性聲明為nonatomic的時候苍匆,訪問這個屬性的時候速度會很快刘急,但是這個屬性不是線程安全的,同時如果一個線程在訪問屬性的get方法浸踩,另外一個線程在訪問屬性的set方法叔汁,那么如果set方法沒有調(diào)用完成,get方法獲得的值可能是錯誤的
atomic是屬性默認(rèn)的检碗,它的速度并不快据块,因為在它的內(nèi)部加入了鎖來保證set活著get方法的完整性,比如一個線程在調(diào)用set方法的時候另外一個線程的get方法必須等待當(dāng)前線程的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];
}
}