原子操作保证数据完整性,稍有编程经验的人都很清楚。但是大多数人的思想还停留在C语言时代,认为不加保护只会导致数据错乱。但是在OC里,这种错误会将直接导致Crash。
举例来说,下面代码
@interface MyTimer()
@property (atomic) NSObject *caller;
@end
- (void)setNew {
_caller = [NSObject new];
}
_caller
赋值这句在ARC环境下,包含了三次操作
- tmp = _caller
- _caller = [NSObject new];
- [tmp release]
在多线程调setNew
方法,会有两种情况
- 两个线程tmp指向同一个对象,那么就会重复release。
- _caller被写入脏数据,直接导致release时crash
所以,一般情况下尽量不要用nonatomic,同时避免直接访问ivar(init方法中除外)。
网友评论