for (int i=0; i<100000; i++) {
dispatch_async(dispatch_get_global_queue(0, 0), ^{
@synchronized (self.dataArray) {
self.dataArray = [NSMutableArray array];
}
});
};
按道理来说,给dataArray加上锁是线程安全的,但是运行这行代码会报错。出现野指针
*** -[__NSArrayM release]: message sent to deallocated instance 0x600000ce11d0
这是为什么呢,首先先说一下 @synchronized,当@synchronized(nil)加锁对象是nil的时候,加锁会失效,就会走它里面的流程。不停的对dataArray进行创建新对象的时候,会执行新对象的创建,和旧对象的释放,会有那么一瞬间,存在哈希表中的dataArray会为nil,然后@synchronized就不加锁,导致self.dataArray连续执行release,从而出现野指针。
如有错误,请留言指正,谢谢!!!










网友评论