OC 中 for-in 和 for 循环的区别

在 OC 中, 遍历数组时会用到四种方式:

  • for 循环
  • for-in 循环
  • 特性block
  • 枚举器

原以为 OC 的 快速枚举 for-in 和 for 是一样的机制, 仅仅是形式不同而已. 但在一次循环遍历数组删除指定元素时, 却意外的出错

比如下面的代码:

for-in 报错

但是用普通 for 循环却不会出现问题:

for

而且有时候因为元素的不同, 也会出现快速枚举成功的情况:

for-in 成功

报错的时候在错误里面有这样的提示:

1
Collection <__NSArrayM: 0x100601400> was mutated while being enumerated.

意思大概就是数组被枚举时发生了突变

显然, for-in 和 for 循环在意义上还是有区别的. 经过查阅, 找到了这样一句话:

快速枚举的过程中不允许改变容器中的对象, 即: 不允许删除或者增加枚举容器中的对象, 因为对于一个既定的枚举器来说, 其内部的对象都已经对其进行了枚举排序, 如果你私自添加或者删除对象, 那么其既定的枚举序列就发生了改变, 而这种改变时系统不能识别的, 所以 OC 中不允许这么做. 但有时候我们也必须在快速枚举的过程中删除一些枚举容器中的对象, 这时候, 我们就需要在删除完一个对象的时候, 对其进行break.

所以以后应该使用 for 循环, 来对数组进行增删、修改操作, 这是应该注意的地方

0%