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