首先排除不可变数组问题。
排查结果:可变数组的读写线程安全问题。
dispatch_barrier_async(self.arrayRWQueue, ^{
[array addObject:object];
});
在给数组添加删除(写操作)的时候虽然用了栅栏函数保证了单写,但是arrayRWQueue定义的是并发队列,所以写操作的异步任务会在子线程进行。(开启了多线程)
但是,读操作(遍历数组)没有做线程安全的控制,即读的时候不允许写,写的时候不允许读。导致主线程在读的时候,子线程在写,线程读写不安全,崩溃。
由于此数组在需求上只是用于定位代理的保存,数据量不大,所以直接简单粗暴在添加删除的时候加锁,代替栅栏函数。
没有继续用栅栏函数的另一个原因是:如果保留,遍历数组的时候需要在同一并发队列里做同步函数,又涉及到代理方法调用切换到主线程等一系列问题,就此打住。
网友评论