众所周知,在OC语言中,遍历数组时会用到四种方式:1、普通for循环;2、快速for循环;3、特性block方式;4、枚举方式。
而笔者一直以为OC的forin和 for是一样的机制,仅仅是形式不同而已。但在一次循环遍历数组删除指定元素的时候,却意外的出错了。。。
比如下面的代码:
但是用普通for循环却不会出现问题:
而且有时候因为元素的不同,也会出现快速枚举forin成功的情况
这个问题曾困扰了好久,一开始以为是哪个地方打错了,然后在错误里面我们看到这样的提示:
Collection <__NSArrayM: 0x10020a2b0> was mutated while being enumerated
意思大概就是集合被枚举时发生了突变。
很显然,快速枚举for in和for循环在意义上还是有区别的。然后我经过查阅,找到了这样一句话:NSArray的枚举操作中有一条需要注意:对于可变数组进行枚举操作时,你不能通过添加或删除对象这类操作来改变数组容器。如果你这么做了,枚举器会很困惑,而你将得到未定义的结果。
而且本身这种操作也是有问题的,数组容器已经改变,可能便利到没有分配的位置,用for循环机器不能自己察觉,但是枚举器可以察觉。
所以以后应该使用for循环,来对数组进行增删、修改操作。这是我们应该注意的地方