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

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

posted @ 2016-10-14 11:06  雅之上善若水  阅读(748)  评论(0编辑  收藏  举报