was mutated while being enumerated, 如何解決For...in... ??中出現(xiàn)的報(bào)錯(cuò)?
這個(gè)報(bào)錯(cuò)赡茸,顧名思義 "在枚舉的時(shí)候發(fā)生了變化"
for...in...利用了快速枚舉NSFastEnumerate
當(dāng)我們想要改變數(shù)組變量中的數(shù)據(jù)或者刪除數(shù)組中的數(shù)據(jù)的時(shí)候,不能用for...in...
應(yīng)該是Objective-C中的foreach循環(huán)與Java中的相似蕊连,在內(nèi)部是用iterator(迭代器)實(shí)現(xiàn)遍歷的悬垃。而不管是在Java還是C++中,一旦修改了被遍歷對象甘苍,在修改前生成的iterator都會(huì)失效尝蠕,所以《C++ Primer》及Java課本中曾警告過不要在用iterator遍歷集合時(shí)增刪集合元素,看來Objective-C中也是一樣载庭。
NSArray的枚舉操作中有一條需要注意:對于可變數(shù)組進(jìn)行枚舉操作時(shí)看彼,你不能通過添加或刪除對象這類操作來改變數(shù)組容器。如果你這么做了囚聚,枚舉器會(huì)很困惑靖榕,而你將得到未定義的結(jié)果。
所以我這里給出三種解決方案
1.利用for loop ()
for (int i = 0; i < arr.count; i++) {
if (...) {
// do sth ;
}
}
2.利用臨時(shí)變量
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; // 相當(dāng)于break ; stop控制跳出枚舉器.
}
}];
出自 was mutated while being enumerated 你是不是以為你真的懂For...in... ??