[FIXED] Vermeidung von „NSArray wurde beim Aufzählen mutiert“

Ausgabe

Ich habe eine NSMutableArray, die Mousejoints für eine Box2d-Physiksimulation speichert. Wenn ich mehr als einen Finger zum Spielen verwende, erhalte ich Ausnahmen

NSArray wurde während der Aufzählung mutiert

Ich weiß, dass dies daran liegt, dass ich Objekte aus dem Array lösche und gleichzeitig durchzähle, wodurch die Aufzählung ungültig wird.

Was ich wissen möchte, ist, was die beste Strategie ist, um dies in Zukunft zu lösen? Ich habe online ein paar Lösungen gesehen: @synchronizedKopieren des Arrays vor dem Aufzählen oder Einfügen des Touch-Joints in ein Garbage-Array zum späteren Löschen (was meiner Meinung nach nicht funktionieren würde, da ich das Mousejoint direkt nach dem Entfernen aus dem Array entfernen muss es aus der Welt).

Lösung

Sie können immer ohne Enumerator iterieren. Das bedeutet eine reguläre for -Schleife, und wenn Sie ein Objekt entfernen:- dekrementieren Sie die Indexvariable und fahren Sie fort; . Wenn Sie die Anzahl des Arrays zwischenspeichern, bevor Sie in die for-Schleife eintreten, stellen Sie sicher, dass Sie diese beim Entfernen eines Objekts ebenfalls verringern.

Jedenfalls sehe ich nicht ein, warum ein Array mit Objekten zum späteren Entfernen ein Problem sein sollte. Ich kenne Ihre genaue Situation und die beteiligten Technologien nicht, aber theoretisch sollte es kein Problem geben. Denn in den meisten Fällen können Sie bei Verwendung dieser Methode in der ersten Aufzählung einfach nichts tun und die eigentliche Arbeit beim Aufzählen des Entfernungsarrays erledigen. Und wenn Sie eine Situation haben, in der Sie in der ersten Aufzählung etwas erneut gegen dasselbe Array prüfen und wissen müssen, dass die Objekte nicht mehr vorhanden sind, können Sie einfach eine Prüfung hinzufügen, um zu sehen, ob sie sich im Entfernungsarray befinden.

Jedenfalls hoffe ich geholfen zu haben. Viel Glück!


Beantwortet von –
daniel.gindi


Antwort geprüft von –
Pedro (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like