突然研究了下for循环和for in 的区别,之前一直觉得这两者是相同的。
for in实际上是快速枚举,跟for循环意义上还是有区别的。你去研究一下枚举。
oc的for in 快速枚举遍历的时候是按照元素在容器内的顺序(NSArray中元素的顺序是你添加的顺序,NSSet和NSDictionry中元素的顺序是按照底层算法进行排序的与你添加的顺序不同)进行枚举的。
要注意的是使用for in快速枚举NSMutableArray这类可变对象时要注意不能对容器进行修改,否则会导致遍历器抛出异常导致程序崩溃。
这是因为用for循环机器不能自己察觉,但是枚举器可以察觉。
实际使用中却不是那么回事,如果在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;
}
}
如果你这么做了,枚举器会很困惑,而你将得到未定义的结果。
这个错误(<__NSArrayM: 0xa4fc000> was mutated while being enumerated.)的意思是:枚举的过程中数组发生了突变