您的位置:首页 > 移动开发 > IOS开发

【Bug-iOS】Collection <__NSArrayM: 0x> was mutated while being enumerated.

2015-10-09 13:30 471 查看
NSMutableArray *mArr = [NSMutableArray
array];
for (int
i = 0; i <
10; i ++) {

    NSMutableDictionary *mDic = [NSMutableDictionary dictionary];

    [mDic setObject:[NSString stringWithFormat:@"%d", i] forKey:@"a"];

    [mArr addObject:mDic];

}
//移除mArr中的某元素
//错误的:
for (NSMutableDictionary *dic
in mArr) {

    if ([dic[@"a"]
isEqualToString:@"3"]) {

        [mArr removeObject:dic];

    }

}
//for-in循环的遍历内容不能被改变,是因为如果移除其遍历的内容便会少一个,而系统是不会允许这个发生的,所以就会crash...
但是当改变遍历的最后一个内容时,就不会crash,因为此时遍历已经结束,结束之后对内容进行修改是允许的。

//正确的:
//方法1.

[mArr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx,
BOOL *stop) {
   
if ([[obj objectForKey:@"a"] isEqualToString:@"3"])
{
        *stop = YES;

        [mArr removeObject:obj];

    }

}];
//方法2.
NSArray *arr = [NSArray
arrayWithArray:mArr];
for (NSMutableDictionary *dic
in arr) {

    if ([dic[@"a"]
isEqualToString:@"3"]) {

        [mArr removeObject:dic];

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: