<__NSArrayM: 0xa4fc000> was muta
2019-01-14 本文已影响0人
OwenWong
崩溃信息:<__NSArrayM: 0xa4fc000> was mutated while being enumerated.
出现这个崩溃的原因通常是:在数组枚举的过程中,修改了数组的元素(比如:添加、删除、修改元素位置)。
for in实际上是快速枚举,常规遍历和for循环没有太大区别。但是枚举操作中有一条需要注意:对于可变数组进行枚举操作时,不能通过添加/删除对象等这类操作来改变数组容器,否则就会报错。根源在于:这种操作造成数组容器改变后,可能遍历到没有分配的位置,用for循环机制不能自己察觉,但是枚举器可以察觉。
Code1(不会崩溃):
NSMutableArray *muteArr = [NSMutableArray arrayWithObjects:@"1",@"2",@"3", nil];
for (int i = 0; i <muteArr.count; i++) {
NSLog(@"%@",muteArr[i]);
if (i == 2) {
// 有意思的是,这里addObject会无限循环添加下去
[muteArr addObject:@"4"];
}
}
NSLog(@"muteArr:%@",muteArr);
Code2(会崩溃):
NSMutableArray *muteArr = [NSMutableArray arrayWithObjects:@"1",@"2",@"3", nil];
for (NSString *obj in muteArr) {
NSLog(@"%@",obj);
[muteArr addObject:@"4"];
}
NSLog(@"muteArr:%@",muteArr);