崩溃记录Collection <__NSArrayM:> was mutated while being enumerated.

首先排除不可变数组问题。
排查结果:可变数组的读写线程安全问题。

  dispatch_barrier_async(self.arrayRWQueue, ^{
    [array addObject:object];
  });

在给数组添加删除(写操作)的时候虽然用了栅栏函数保证了单写,但是arrayRWQueue定义的是并发队列,所以写操作的异步任务会在子线程进行。(开启了多线程)

但是,读操作(遍历数组)没有做线程安全的控制,即读的时候不允许写,写的时候不允许读。导致主线程在读的时候,子线程在写,线程读写不安全,崩溃。
由于此数组在需求上只是用于定位代理的保存,数据量不大,所以直接简单粗暴在添加删除的时候加锁,代替栅栏函数。

没有继续用栅栏函数的另一个原因是:如果保留,遍历数组的时候需要在同一并发队列里做同步函数,又涉及到代理方法调用切换到主线程等一系列问题,就此打住。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容