Sammlung <__NSArrayM: 0x76c11b0> war, mutierte während aufgezählt werden
Ich bin relativ neu in obj-c, also ich muss etwas fehlen, aber mein Programm Abstürzen, wenn ein Feind, kollidiert mit einer Wand. Habe ich gelegen, wo ich bin, entfernen Sie den Feind aus der Schleife, während die Schleife, aber für das Leben von mir, ich kann nicht herausfinden, wie es zu lösen ist.
Mein code ist wie folgt:
(der Fehler ist "[allEnemies removeObject:enemyType1];")
//IMMER AUSGEFÜHRT
-(void) update:(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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, so wie die Fehlermeldung heißt, Sie mutiert das array, während es wurde aufgezählt werden. Der einfachste fix ist, das zu tun
for (CCSprite *enemyType1 in [[allEnemies copy] autorelease])
Diese Weise, die Sie aufzählen, eine Kopie des Arrays (dies bedeutet NICHT, kopieren Sie die Elemente, die nur gibt Ihnen einen anderen Behälter, um aufzuzählen), und kann sich noch ändern, die mutable-array.Können Sie nicht ändern Behälter beim aufzählen Ihnen.
Das problem liegt in dieser Zeile des Codes:
[allEnemies removeObject:enemyType1];
Sie sind der Aufzählung ein array
allEnemies
und entfernen ein Objekt aus dem array in der gleichen Aufzählung, die das Problem verursacht. Sollten Sie ein temp-array für die Schleife, während in Wirklichkeit mutiert(removeObject:
) dem anderen array.Können Sie nicht löschen von Elementen aus einer
NSMutableArray
während der Iteration es.Gibt es verschiedene Lösungen:
oder
for
Schleife anstelle derfor each
syntax.Nicht kopieren der array speichert Sie eine Zuweisung und ein paar CPU-Zyklen:
Auch dies könnte passieren, wenn Sie hinzufügen, ein Objekt in NSMutableArray und Lesen Datensatz aus dem array. Und diese 2 Aufgaben sind, geschieht in zwei verschiedenen Threads. Wie einem geschieht im hintergrund-thread und einem anderen ein geschehen auf der Haupt-thread. Also vorsichtig über das Gewinde als auch.