美文网首页iOS开发程序员
was mutated while being enumera

was mutated while being enumera

作者: 孟熠冉的简书 | 来源:发表于2017-06-06 15:45 被阅读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... ??

    相关文章

      网友评论

        本文标题: was mutated while being enumera

        本文链接:https://www.haomeiwen.com/subject/bmfwfxtx.html