标签:代码 ... 可变 数组 不能 未定义 没有 删除对象 was
一 效率:
for VS for(... in ...)
测试代码:
10^7 的数组,时间单位 秒,精确度 毫秒
测试结果:
考虑到实际情况,ForLoop 的操作较多些。
1 [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 2 //..... 3 }];
如果在for in 循环里,对这个数组进行了修改的话,无论是增,删,修改数组元素位置,都会扔一个异常出来,错误是被遍历的数组已被销毁(<__NSArrayM: 0xa4fc000> was mutated while being enumerated.),比如以下代码:
NSMutableArray* arr = [NSMutableArray arrayWithObjects:@"1",@"2",@"3", nil];
for (NSString* str in arr) {
if ([str isEqualToString:@"1"] || [str isEqualToString:@"5"]) {
[arr addObject:@"4"]; //或者 [arr removeObject:@"1"]; 或者 [arr exchangeObjectAtIndex:0 withObjectAtIndex:2];
continue;
}
}
原因:
for in实际上是快速枚举,跟for循环意义上还是有区别的。
NSArray的枚举操作中有一条需要注意:对于可变数组进行枚举操作时,你不能通过添加或删除对象这类操作来改变数组容器。如果你这么做了,枚举器会很困惑,而你将得到未定义的结果。
而本身这种操作也是有问题的,数组容器已经改变,可能遍历到没有分配的位置,用for循环机器不能自己察觉,但是枚举器可以察觉。
追加,这个错误(<__NSArrayM: 0xa4fc000> was mutated while being enumerated.)的意思是:枚举的过程中数组发生了突变
标签:代码 ... 可变 数组 不能 未定义 没有 删除对象 was
原文地址:http://www.cnblogs.com/LoveStoryJX/p/6547764.html