最近改寫code時遇到的這個問題,因為自己沒有發現,所以造成錯誤。
Collection was mutated while being enumerated
基本上,這是由於當你在enumerate你的array時,你更動了你正在enumerate的array,才會造成的錯誤。
這樣講可能不是正確的,但你可以想像說當我們在enumerate某個特定的array時,這個array其實在這個過程中是被看作是確定的,你總不可能在一個人把保險箱打開一樣一樣物品檢查的時候,又同時有人把東西放進去吧? 因為在看array中的每一樣東西,所以無法同時對這個array做其他更動,這應該是在enumerate某件東西時應該要注意的事項。
看個例子吧:
for (CCSprite *enemySprite in enemyArray) {
if (CGRectIntersectsRect([enemySprite boundingBox], [egg1 boundingBox])) {
[enemyCatchEgg addObject:enemySprite];
}
if ([bird numberOfRunningActions] != 0) {
if (CGRectIntersectsRect([enemySprite boundingBox], [bird boundingBox])) {
[enemyToDelete addObject:enemySprite];
CCLOG(@"bird touch enemy");
}
}
//other code.....
for (CCSprite *enemySprite in enemyToDelete)
[enemyArray removeObject:enemySprite];
// other code.....
}
重點就是畫綠色線的這行,這行很清楚的說明,它把正在enumerate的enemySprite更動了!移除了某個sprite,這就會造成錯誤。所以請不要在enumerate某個array的當下更動array本身。
Collection was mutated while being enumerated
基本上,這是由於當你在enumerate你的array時,你更動了你正在enumerate的array,才會造成的錯誤。
這樣講可能不是正確的,但你可以想像說當我們在enumerate某個特定的array時,這個array其實在這個過程中是被看作是確定的,你總不可能在一個人把保險箱打開一樣一樣物品檢查的時候,又同時有人把東西放進去吧? 因為在看array中的每一樣東西,所以無法同時對這個array做其他更動,這應該是在enumerate某件東西時應該要注意的事項。
看個例子吧:
for (CCSprite *enemySprite in enemyArray) {
if (CGRectIntersectsRect([enemySprite boundingBox], [egg1 boundingBox])) {
[enemyCatchEgg addObject:enemySprite];
}
if ([bird numberOfRunningActions] != 0) {
if (CGRectIntersectsRect([enemySprite boundingBox], [bird boundingBox])) {
[enemyToDelete addObject:enemySprite];
CCLOG(@"bird touch enemy");
}
}
//other code.....
for (CCSprite *enemySprite in enemyToDelete)
[enemyArray removeObject:enemySprite];
// other code.....
}
重點就是畫綠色線的這行,這行很清楚的說明,它把正在enumerate的enemySprite更動了!移除了某個sprite,這就會造成錯誤。所以請不要在enumerate某個array的當下更動array本身。
留言
張貼留言