nonatomic 带来的线程安全问题
一、结论
一个对象对外暴露的读写属性,如果这个属性在多个线程中访问,一定会出现crash。
因此对外暴露的属性一定要考虑线程安全问题。
二、看下面的代码
下面的代码一定会crash,除非obj是atomic
@interface ViewController () @property (nonatomic, strong) TestObject *obj; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ for (int i = 0; i < 10000; i++) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ self.obj = [[TestObject alloc] init]; }); } }); }
三、现象
产生的现象是一个线程访问这个对象的时候,这个对象已经释放,可能是错误的内存、野指针等情况。