was mutated while being enumerat

作者: TEASON | 来源:发表于2015-10-09 16:49 被阅读6742次

    支持原创,如需转载, 请注明出处
    你是不是以为你真的懂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控制跳出枚举器.
                }
            }];
    

    相关文章

      网友评论

      • 大Z哥:thanks
      • 孟熠冉的简书:用你的办法解决了我的bug,多谢
      • 8d7f845d2cde:楼主,建议你应该写详细点,方法二补充下:
        NSMutableArray *duplicateArray = [OriginalArray mutableCopy];
        for(id obj in duplicateArray){
            if ([ob isEqualToString:@"3"]){
              [OriginalArray removeObject:obj];
            }
          }
        羊肉泡馍啊:不错就是这样
        macfai:补充的真不错,是核心内容,多谢

        koreadragon:@爱吃草莓的Rock 补充的很到位 :wink:
      • fc18f69e6ff0:第二种方法,利用变量, 你的意思是遍历的是 tmp 操作的是 arr 对吧.我有个疑问就是在操作完 arr 之后赋值给 tmp 这个不会造成 was mutated while being enumerate 这个错误么?
        koreadragon:@闭上眼睛 tmp只是用来遍历,涉及到增删改的时候还是要操作arr的

      本文标题:was mutated while being enumerat

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