在OC语言中,遍历数组时会用到四种方式:
1、普通for循环;2、快速for循环;3、特性block方式;4、枚举方式。
原以为OC的forin和 for是一样的机制,仅仅是形式不同而已。但在一次循环遍历数组删除指定元素的时候,却意外的出错
比如下面的代码:
但是用普通for循环却不会出现问题:
而且有时候因为元素的不同,也会出现快速枚举forin成功的情况
然后在错误里面有这样的提示:
Collection <__NSArrayM: 0x100601400> was mutated while being enumerated.
意思大概就是数组被枚举时发生了突变。
显然,快速枚举for in和for循环在意义上还是有区别的。经过查阅,找到了这样一句话:
快速枚举的过程中不允许改变容器中的对象,即不允许删除或者增加枚举容器中的对象,因为对于一个既定的枚举器来说,其内部的对象都已经对其进行了枚举排序,如果你私自添加或者删除对象,那么其既定的枚举序列就发生了改变,而这种改变时系统不能识别的,所以OC中不允许这么做。但有时候我们也必须在快速枚举的过程中删除一些枚举容器中的对象,这时候,我们就需要在删除完一个对象的时候,对其进行break。
所以以后应该使用for循环,来对数组进行增删、修改操作,这是应该注意的地方