[iOS] error code: Collection was mutated while being enumerated

最近改寫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本身。  

留言