一、结论
一个对象对外暴露的读写属性,如果这个属性在多个线程中访问,一定会出现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];
});
}
});
}
三、现象
产生的现象是一个线程访问这个对象的时候,这个对象已经释放,可能是错误的内存、野指针等情况。