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

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... ??

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,349评论 0 33
  • 支持原创,如需转载, 请注明出处你是不是以为你真的懂For...in... ??哈哈哈哈, 我也碰到了这个报错 ....
    TEASON阅读 13,985评论 8 19
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,917评论 18 399
  • 我们已经不是小孩子了,人生有些路需要我们自己咬牙坚持的走完,值得庆幸的是别人也要同我们一样体验,我们已经长大了,不...
    闲37阅读 1,631评论 0 0
  • 莉香在一家小公司上班,第二份工作。每天下班回家,地铁里都挤满各样的人:穿铆钉靴梳大背头的年轻男子,妆容精致的女生,...
    大葱zan酱阅读 1,677评论 0 0