您的位置:首页 > 其它

[Bug]枚举数组,并找到某些元素删除

2016-10-14 11:06 162 查看
lldb报错:Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x7f9a5a47dda0> was mutated while being enumerated.'

bug代码:

//判断是否存在,存在就删除
for (NSDictionary *dic in userAccountPwdMutalDatas) {
if ([dic objectForKey:account]) {
[userAccountPwdMutalDatas removeObject:dic];
}


  

原因

当for in 时,正在被枚举的时候,改变数组(例如删除),会打乱其的count 。

解决一:将要操作的数据copy到另一个数组里

NSMutableArray * arrayB = [[NSMutableArray alloc] init];
for (arrayA *a in anArray){
if(some condition){
//[anArray removeObject:a];
[arrayB addObject:a];
}
}
[arrayA removeObjectsInArray:arrayB];


解决二:循环枚举顺序,不要从 0到 count 改成从count到0

for(int i = [anArray count] -1;i>=0;i--){

}


  

解决三:

for(int i=0; i < [array count]; i++){
if(YES){
[array removeObjectAtIndex:i];
i--;
}
}


  

Tip:其实这个问题,自己遇到过,并且解决了。但是没有做记录,结果再次遇到的时候,只觉得lldb报错眼熟,还花了大力气到google 上搜。好记性不然烂笔头。这次做个笔记,

参考文档:http://www.cocoachina.com/bbs/read.php?tid=23251
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: