Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0xb550c30> was mutated while being enumerated.'

屏幕快照 2015-04-10 10.14.48.png

错误代码:

NSMutableArray *memberarray=[[NSMutableArray alloc]initWithArray:MEMBERARRAY];
    for (NSDictionary *dic in memberarray) {
        if ([[dic valueForKey:@"username"] isEqualToString:self.myusername.text])
        {
            [memberarray removeObject:dic];
        }
    }

当程序出现这个提示的时候,是因为你一边便利数组,又同时修改这个数组里面的内容,导致崩溃

1、解决方法:

NSMutableArray * arrayTemp = xxx; 
NSArray * array = [NSArray arrayWithArray: arrayTemp];  
for (NSDictionary * dic in array) {        
    if (condition){            
       [arrayTemp removeObject:dic];
    }       
}

这种方法的原理就是再定义一个一模一样的数组,便利数组A,当有数据的时候,操作数组B进行删除操作。

2、当然,如果你的只是去除某一个,可以直接在 remove 之后加上 break 也可以,这样就停止了遍历,也可以解决安敢

3、另外一种参考方法

NSMutableArray *tempArray = [[NSMutableArray alloc]initWithObjects:@"12",@"23",@"34",@"45",@"56", nil];
[tempArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
      if ([obj isEqualToString:@"34"]) {
           *stop = YES;
            if (*stop == YES) {
                [tempArray replaceObjectAtIndex:idx withObject:@"3333333"];
            }
        }
      if (*stop) {
            NSLog(@"array is %@",tempArray);
      }
}];

利用block来操作,根据查阅资料,发现block便利比for便利快20%左右,这个的原理是这样的:
找到符合的条件之后,暂停遍历,然后修改数组的内容
这种方法非常简单哟

参考文章

http://blog.csdn.net/piaodang1234/article/details/11902541

Last modification:January 1st, 1970 at 08:00 am
如果看了这个文章可以让你少加会班,可以请我喝杯可乐
已打赏名单
微信公众号

Leave a Comment