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

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

2015-02-04 11:18 639 查看
[objc] view
plaincopy





//init a NSArray

NSMutableArray *arr2 = [NSMutableArray array];

for (int i=0; i<10; ++i) {

NSMutableDictionary *d = [NSMutableDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"%d", i], @"a", nil nil];

[arr2 addObject:d];

}

//Wrong

for (NSMutableDictionary *s in arr2) {

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

[arr2 removeObject:s]; //while here is safe for s[@"a"] = @"eeee";

}

}

//Safe 1.

[arr2 enumerateObjectsUsingBlock:^(NSMutableDictionary *obj, NSUInteger idx, BOOLBOOL *stop) {

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

*stop = YES;

[arr2 removeObject:obj]; // or obj[@"a"] = @"4ewewewe";

}

}];

//Safe 2.

NSArray *tmp = [NSArray arrayWithArray:arr2];

for (NSMutableDictionary *s in tmp) {

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

s[@"a"] = @"eeee";

[arr2 removeObject:s];

}

}

利用block来操作,根据查阅资料,发现block便利比for便利快20%左右,这个的原理是这样的:

找到符合的条件之后,暂停遍历,然后修改数组的内容

PS: 搜一句补充的话

//forin 循环中的便利内容不能被改变, 是因为如果改变其便利的内容会少一个, 而系统是不会允许这个发生的所以就会crash...但是当改变最后一个的内容时, 就不会crash, 是因为此时遍历已经结束, 结束之后对内容做修改是允许的 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐