集合< __ NSArrayM:0x76c11b0>在被列举时被突变

时间:2011-12-10 18:19:37

标签: objective-c cocos2d-iphone

我对obj-c比较新,所以我必须遗漏一些东西,但是当敌人与墙碰撞时我的程序会崩溃。我已经找到了我从循环中移除敌人的地方,而在循环中,但对于我的生活,我无法弄清楚如何解决它。 我的代码如下:

(错误是“[allEnemies removeObject:enemyType1];”)

//始终跑步 - (void)更新:(ccTime)dt {

for (CCSprite *enemyType1 in allEnemies) { //for every attacking unit in allEnemies

    //Adjust the collison box for each enemey depending on the height of the enemy
    float a;
    float b;
    float yOne = (wall.contentSize.height-enemyType1.position.y);
    float yTwo = (wall.contentSize.height);
    float xTwo = 30;
    a = (xTwo*(yOne/yTwo)); // always < 1
    b = xTwo-a;             // always > 1


    //Create the altered collison box 
    CGRect enemyType1Rect = CGRectMake (
                enemyType1.position.x - (enemyType1.contentSize.width/2), 
                enemyType1.position.y - (enemyType1.contentSize.height/2), 
                enemyType1.contentSize.width+b, 
                enemyType1.contentSize.height
                                       );


    //If the enemey hits the wall, stop it, then add it to the attacking enemies array
    if (CGRectIntersectsRect(enemyType1Rect, wall.boundingBox)) {
        [enemyType1 stopAllActions];
        [allEnemies removeObject:enemyType1];
        [attackingEnemies addObject:enemyType1];            
    }


}
//Wall Collison END

4 个答案:

答案 0 :(得分:24)

好吧,正如错误所述,你在枚举时改变了数组。最简单的解决方法是执行for (CCSprite *enemyType1 in [[allEnemies copy] autorelease])这样你就可以枚举数组的副本(这不会复制元素,只是给你另一个容器来枚举它们),并且仍然可以修改可变数组。 / p>

枚举时不能修改容器。

答案 1 :(得分:4)

问题出在这行代码中:[allEnemies removeObject:enemyType1]; 您正在枚举数组allEnemies并从同一枚举中删除数组中导致问题的对象。您应该使用临时数组进行循环,同时实际变异(removeObject:)另一个数组。

答案 2 :(得分:2)

在迭代时,您无法从NSMutableArray删除项目。

有几种解决方案:

  • 迭代数组的副本

  • 使用基于索引的for循环而不是for each语法。

不复制数组可以节省分配和几个CPU周期:

for (int i = updatedLocalityArray.count-1 ; i >= 0 ; i--)
{
    NSString *test = updatedLocalityArray[i];
    if ([test isEqualToString:tableViewCell.textLabel.text])
    {
        [updatedLocalityArray removeObjectAtIndex:i];
        NSLog(@"%@ *****", updatedLocalityArray);
    }
}

答案 3 :(得分:0)

当您将对象添加到NSMutableArray并从该数组中读取记录时,也可能发生这种情况。而这两项任务正在两个不同的线程中发生。就像一个正在后台线程中发生而另一个正在主线程上发生。所以也要小心线程。