你是不是以為你真的懂For...in... ??
哈哈哈哈, 我也碰到了這個報錯 .
究其原因, 顧名思義 "在枚舉的時候發(fā)生了變化"
for...in...利用了快速枚舉NSFastEnumerate
當我們想要改變數(shù)組變量中的數(shù)據(jù)或者刪除數(shù)組中的數(shù)據(jù)的時候,不能用for...in...
應該是Objective-C中的foreach循環(huán)與Java中的相似方库,在內(nèi)部是用iterator(迭代器)實現(xiàn)遍歷的。而不管是在Java還是C++中纬向,一旦修改了被遍歷對象,在修改前生成的iterator都會失效,所以《C++ Primer》及Java課本中曾警告過不要在用iterator遍歷集合時增刪集合元素栗弟,看來Objective-C中也是一樣在辆。
NSArray的枚舉操作中有一條需要注意:對于可變數(shù)組進行枚舉操作時,你不能通過添加或刪除對象這類操作來改變數(shù)組容器泳姐。如果你這么做了效拭,枚舉器會很困惑,而你將得到未定義的結果胖秒。
所以我這里給出三種解決方案
1.利用for 循環(huán)
for (int i = 0; i < arr.count; i++) {
if (...) {
// do sth ;
}
}
2.利用臨時變量
NSMutableArray *duplicateArray = [OriginalArray mutableCopy];
for(id obj in duplicateArray){
if ([ob isEqualToString:@"3"]){
[OriginalArray removeObject:obj];
}
}
3.enumerateObjectsUsingBlock(推薦)
[arr enumerateObjectsUsingBlock:^(NSMutableDictionary *obj, NSUInteger idx, BOOL *stop) {
if (...) {
// do sth
*stop = YES; // 相當于break ; stop控制跳出枚舉器.
}
}];