在iOS中,如果一个属性没有声明是nonatomic还是atomic,那么它默认是atomic。
nonatomic不保证原子性,当一个属性声明为nonatomic的时候,访问这个属性的时候速度会很快,但是这个属性不是线程安全的,同时如果一个线程在访问属性的get方法,另外一个线程在访问属性的set方法,那么如果set方法没有调用完成,get方法获得的值可能是错误的
atomic是属性默认的,它的速度并不快,因为在它的内部加入了锁来保证set活着get方法的完整性,比如一个线程在调用set方法的时候另外一个线程的get方法必须等待当前线程的set方法调用完毕之后才能调用。atomic虽然保证的set和get方法的完整性,但是它并不是线程安全的,因为atomic只是保证了读写方法的完整性,但是一个属性除了读写方法还有另外的方法,比如release,所以nonatomic和atomic的区别就是在于set和get方法的区别
代码
//nonatomic系统生成的代码如下:
- (UITextField *) userName {
return userName;
}
- (void) setUserName:(UITextField *)userName_ {
[userName_ retain];
[userName release];
userName = userName_;
}
//atomic系统生成的代码如下:
- (UITextField *) userName {
UITextField *retval = nil;
@synchronized(self) {
retval = [[userName retain] autorelease];
}
return retval;
}
- (void) setUserName:(UITextField *)userName_ {
@synchronized(self) {
[userName release];
userName = [userName_ retain];
}
}