7
votes

Collection <__ nsarraym: 0x76c11b0> a été muté tout en étant énuméré

Je suis relativement nouveau à Obj-C, il me manque donc de manquer quelque chose, mais mon programme s'écrase lorsqu'un ennemi se heurte à un mur. J'ai localisé où je retiens l'ennemi de la boucle, tandis que dans la boucle, mais pour la vie de moi, je ne peux pas comprendre comment le réparer. Mon code est le suivant:

(l'erreur est "[Allenemies SuppressionObject: Enemyype1];")

// toujours en cours d'exécution - (vide) mise à jour: (cctime) dt { xxx


0 commentaires

4 Réponses :


24
votes

Eh bien, tout comme les états d'erreur, vous avez muté le tableau alors qu'il était énuméré. La solution la plus facile est de faire pour (ccsprite * ennemyype1 dans [[Allenemies Copy] AutoRelease]) De cette façon, vous énumérez une copie de la matrice (cela ne copie pas les éléments, vous en donne simplement une autre conteneur pour les énumérer), et peut toujours modifier la matrice mutable.

Vous ne pouvez pas modifier les conteneurs tout en leur énumérant.


5 commentaires

OK, alors pouvez-vous expliquer ce que cela fait exactement? Est-ce que [Allenemies Copy] effectue une copie de la matrice et la retirera-t-elle du tableau d'origine "Allenemies". Aussi, lorsque vous mettez "Autoréleuil" là-bas, vous n'avez pas besoin d'avoir "[Allenemies Supprimer: Enemyype1];" à droite? Désolé si cela sonne vraiment stupide (je viens de recevoir Xcode 4 et non de cela me dérangeait dans 3). Edit: Alors j'ai changé ce morceau de code et maintenant je reçois: Impossible de ne pas enregistrer com.yourcompany.stromthehouse avec le serveur Bootstrap. Erreur: code d'erreur inconnu.


Ok, Xcode me déteste. Donc, je pense que je reçois "pour (ccsprite * ennemyype1 dans [[Allenemies Copy] Autorelease])", et je ne reçois pas l'erreur de bootstrap, mais maintenant lorsque j'essaie de tester sur le périphérique, je reçois une nouvelle erreur: Stormhehouse [ 11129: 707] Cocos2D: Impossible d'ajouter une image: Wall.png dans cctexturecache 2011-12-10 11: 02: 05.888 Stormléhouse [11129: 707] *** Échec de l'affirmation dans - [Helloworld AddChild:], / Utilisateurs / Rauhul / Rauhul /Desktop/invasion/libs/cocos2d/ccnode.m:385 2011-12-10 11: 02: 05.890 Stormthehouse [11129: 707] *** Application de terminaison due à une exception non capturée 'NsinternalIncONSistencyException', raison: "L'argument doit être non -néant'


nvm ces messages que j'ai compris ce qui se passait, j'avais référencé wall.png dans mon code mais les images étaient wall.png, thx soooo beaucoup


Vous pouvez également énumérer en sens inverse, auquel cas l'élimination des objets lors de l'itération est légal.


@ Learncocos2D En raison du fait que [Array Reverectenumerator] vous donne un autre énumérateur de traiter, essentiellement un tableau différent.



4
votes

Le problème réside dans cette ligne de code: [Allenemies Supprimer: Enemyype1]; Vous énumérez un tableau Allenemies et supprimez un objet de la matrice dans la même énumération qui cause le problème. Vous devez utiliser un tableau temporaire pour la boucle lors de la mutation réelle ( retirez-vous: ) l'autre tableau.


0 commentaires

0
votes

Cela pourrait également être arrivé, lorsque vous ajoutez un objet dans NsmutableRayRay et enregistrez l'enregistrement de ce tableau. Et ces 2 tâches se produisent dans deux fils différents. Comme on se passe dans le fil d'arrière-plan et un autre se produit sur le fil principal. Si prudent le filetage aussi.


0 commentaires

2
votes

Vous ne pouvez pas supprimer des éléments d'un nsmutableArray code> tout en itération.

Il y a plusieurs solutions à ceci: p>

  • Itérale une copie du tableau li> ul>

    ou p>

    • Utilisez une boucle pour code> basée sur index au lieu du pour chaque syntaxe code>. li> ul>

      ne pas copier le tableau vous enregistre une allocation et quelques cycles de CPU: P>

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


0 commentaires