iOS开发程序员

was mutated while being enumera

2017-06-06  本文已影响32人  孟熠冉的简书

was mutated while being enumerated, 如何解决For...in... ??中出现的报错?

这个报错,顾名思义 "在枚举的时候发生了变化"
for...in...利用了快速枚举NSFastEnumerate
当我们想要改变数组变量中的数据或者删除数组中的数据的时候,不能用for...in...

应该是Objective-C中的foreach循环与Java中的相似,在内部是用iterator(迭代器)实现遍历的。而不管是在Java还是C++中,一旦修改了被遍历对象,在修改前生成的iterator都会失效,所以《C++ Primer》及Java课本中曾警告过不要在用iterator遍历集合时增删集合元素,看来Objective-C中也是一样。

NSArray的枚举操作中有一条需要注意:对于可变数组进行枚举操作时,你不能通过添加或删除对象这类操作来改变数组容器。如果你这么做了,枚举器会很困惑,而你将得到未定义的结果。

所以我这里给出三种解决方案

1.利用for loop ()

 for (int i = 0; i < arr.count; i++) {
            if (...) {
                // do sth ;
            }
        }

2.利用临时变量

   NSArray *tmp = [NSArray arrayWithArray:arr];
        for (id obj in tmp) {
            if (...) {
               // do sth ;
            }
        }

3.enumerateObjectsUsingBlock(推荐)

   [arr enumerateObjectsUsingBlock:^(NSMutableDictionary *obj, NSUInteger idx, BOOL *stop) {
            if (...) {
                // do sth
                *stop = YES; // 相当于break ; stop控制跳出枚举器.
            }
        }];

出自 was mutated while being enumerated 你是不是以为你真的懂For...in... ??

上一篇下一篇

猜你喜欢

热点阅读