一、结论
一个对象对外暴露的读写属性,如果这个属性在多个线程中访问,可能会出现crash。因此对外暴露的属性一定要考虑线程安全问题。
二、看下面的代码
#import "ViewController.h" @interface ViewController () @property (nonatomic, strong) NSObject *obj; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. for (int i = 0; i < 2; i++) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ self.obj = [[NSObject alloc] init]; }); } }
分析:
obj的set方法,系统默认会先释放掉旧的_obj,然后新的obj才会retain,一个线程给obj设置了值,如果后面有两个线程又同时给obj设置值时,就会同时把obj给release释放两次。过渡释放造成崩溃
obj是atomic时,不会崩溃,里面加了自旋锁。同步锁,set,get方法只能串行执行。
三、现象
产生的现象是一个线程访问这个对象的时候,这个对象已经释放,可能是错误的内存、野指针等情况。
原文:https://www.cnblogs.com/huangzs/p/13932928.html