美文网首页iOS错误&解决
崩溃记录Collection <__NSArrayM:> was

崩溃记录Collection <__NSArrayM:> was

作者: FreshAlpha | 来源:发表于2021-02-05 10:12 被阅读0次

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

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

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

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

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

    相关文章

      网友评论

        本文标题:崩溃记录Collection <__NSArrayM:> was

        本文链接:https://www.haomeiwen.com/subject/ffewtltx.html