Collection <__NSArrayM: 0x7fc7f162c1d0> was mutated while being enumerated.'错误原因及分析

简介

今天看某大神的微博讲数组便利时修改数组元素的问题 突然想到自己以前也遇到过这样的坑 特此记录一下

内容

我们经常用到的遍历数组的方式大概有三种:for, for in, enumerateObjectsUsingBlock:。在这三种方法中,使用for和enumerateObjectsUsingBlock:迭代时,可以修改数组,不会有Crash等问题,如图1代码所示。

Collection <__NSArrayM: 0x7fc7f162c1d0> was mutated while being enumerated.'错误原因及分析_第1张图片
图一

但这里有个潜在的问题,如果遍历时删除元素,可能导致后面的元素不会被遍历到,如图2代码所示。

Collection <__NSArrayM: 0x7fc7f162c1d0> was mutated while being enumerated.'错误原因及分析_第2张图片
图二

而如果使用for in来遍历时,修改元素会抛出NSGenericException异常,如图3代码所示,其异常如图4所示。

Collection <__NSArrayM: 0x7fc7f162c1d0> was mutated while being enumerated.'错误原因及分析_第3张图片
图三
Collection <__NSArrayM: 0x7fc7f162c1d0> was mutated while being enumerated.'错误原因及分析_第4张图片
图四

当时我的做法是,从原数组中拷贝一个数组出来,去遍历拷贝数组,过滤出所需要的元素,再对原数组进行操作,如图5代码所示。

Collection <__NSArrayM: 0x7fc7f162c1d0> was mutated while being enumerated.'错误原因及分析_第5张图片
图五

还有一种方法可以让我们便利的同时 删除数组 就是采用倒叙便利 如图6 图7

Collection <__NSArrayM: 0x7fc7f162c1d0> was mutated while being enumerated.'错误原因及分析_第6张图片
图六
Collection <__NSArrayM: 0x7fc7f162c1d0> was mutated while being enumerated.'错误原因及分析_第7张图片
图七

你可能感兴趣的:(Collection <__NSArrayM: 0x7fc7f162c1d0> was mutated while being enumerated.'错误原因及分析)