Collection <__NSArrayM: 0x76c11b0> a été muté, tout en étant énumérés
Je suis relativement nouveau à l'obj-c, donc je dois manquer quelque chose, mais mon programme crash quand un ennemi entre en collision avec un mur. J'ai situé l'endroit où je suis retrait de l'ennemi à partir de la boucle, alors que dans la boucle, mais pour la vie de moi, je ne peux pas comprendre comment le corriger.
Mon code est comme suit:
(l'erreur est "[allEnemies removeObject:enemyType1];")
//TOUJOURS EN COURS D'EXÉCUTION
-(void) mise à jour:(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
OriginalL'auteur user1091516 | 2011-12-10
Vous devez vous connecter pour publier un commentaire.
Eh bien, tout comme les états d'erreur, vous muté le tableau alors qu'il a été dénombré. La meilleure solution est de faire
for (CCSprite *enemyType1 in [[allEnemies copy] autorelease])
de Cette façon, vous êtes l'énumération d'une copie du tableau (ce qui ne permet PAS de copier les éléments, vous donne juste un autre récipient pour les énumérer), et peut encore modifier la mutable tableau.Vous ne pouvez pas modifier les conteneurs lors de l'énumération.
Ok, xcode me déteste. donc, je pense que j'ai "(CCSprite *enemyType1 dans [[allEnemies copie] autorelease])", et je ne suis pas le bootstrap d'erreur, mais maintenant, quand j'essaie de le tester sur le Périphérique, je reçois un nouveau message d'erreur: StormTheHouse[11129:707] cocos2d: impossible d'ajouter une image:mur.png dans CCTextureCache 2011-12-10 11:02:05.888 StormTheHouse[11129:707] *** échec d'Assertion dans -[HelloWorld addChild:], /Users/rauhul/Desktop/Invasion/libs/cocos2d/CCNode.m:385 2011-12-10 11:02:05.890 StormTheHouse[11129:707] *** fin de l'app en raison de uncaught exception 'NSInternalInconsistencyException', la raison: "l'Argument doit être non nul'
nvm ces postes, j'ai compris ce qui se passait, j'avais référencé mur.png dans mon code, mais les images de la PAROI.png, Merci soooo beaucoup
Vous pouvez également énumérer dans le sens inverse, auquel cas la suppression d'objets au cours d'une itération est légal.
c'est parce que de cela [tableau reverseEnumerator] vous donne un autre agent recenseur votre e traiter avec, essentiellement, un tableau différent.
OriginalL'auteur Joshua Weinberg
Le problème se trouve dans cette ligne de code:
[allEnemies removeObject:enemyType1];
vous énumérez un tableau
allEnemies
et la suppression d'un objet à partir de la matrice dans la même énumération qui est à l'origine du problème. Vous devez utiliser un temp tableau de la boucle tout en mutation (removeObject:
), de l'autre tableau.OriginalL'auteur Saurabh Passolia
Vous ne pouvez pas supprimer des éléments d'une
NSMutableArray
lors de l'itération.Il y a plusieurs solutions à ce problème:
ou
for
boucle au lieu de lafor each
syntaxe.Pas de copier le tableau vous permet d'économiser une allocation et un peu de cycles de PROCESSEUR:
OriginalL'auteur Pawan Ahire
Aussi ce qui pourrait se produire, lors de l'ajout d'un objet dans NSMutableArray et lecture des enregistrements à partir de ce tableau. Et ces 2 tâches sont en cours dans deux thread différent. Comme on est passe dans le thread d'arrière-plan et un autre qui se passe sur le thread principal. Donc prudent sur le filetage.
OriginalL'auteur Saleh Sultan