Frage

Das ist wirklich seltsam ...

Ich führe meine App aus und während sie sich öffnet und die Ansichten konstruieren, bekomme ich:

Collection <CALayerArray: 0x124650> was mutated while being enumerated.

Der Code -Trace durchläuft Folgendes:

main
UIApplicationMain
-[UIApplication _run]
CFRunLoopRunInMode
CFRunLoopRunSpecific
_UIApplicationHandleEvent
-[UIApplication sendEvent:]
-[UIApplication handleEvent:withNewEvent:]
-[UIApplication _runWithURL:sourceBundleID:]
-[UIApplication _performInitilizationWithURL:sourceBundleID:]
-[AppDelegate applicationDidFinishLaunching:]
+[Controller initializeController] //This is my own function
    [window addSubview: pauseMenuController.view] //This is the last point of my code it goes through
-[UIView(Hierarchy) addSubview:]
-[UIView(Internal) _addSubview:positioned:relativeTo:]
-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:]
-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]
-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]
_NSFastEnumerationMutationHandler
objc_exception_throw

Ich habe das Spiel viel, viele und viele Male gelaufen und ich habe das noch nie gesehen, dann tauchte es plötzlich auf. Das Seltsame ist, dass ich keine anderen Threads erstelle (die ich weiß), bis nach Dieser Code wird alle aufgerufen. Es wird für mich einfacher sein, dies zu debuggen, wenn mir jemand eine Erklärung dafür geben kann, was möglicherweise geändert wird, während er in einem UIView zugegriffen wird. Hat es etwas damit zu tun, der Ansicht etwas hinzuzufügen, während es vielleicht schon etwas hinzufügt? Irgendwelche Ideen?

War es hilfreich?

Lösung

Es ist keine Ausnahme von Parallelität. Ausnahmen der Aufzählungsmutation passieren, wenn etwas (möglicherweise in einer Schleife im selben Thread) das Array/Set/Wörterbuch verändert, dass die Schleife iteriert.

Da AddSubView: im Stapel ist, vermute ich, dass etwas versucht, eine der Unteransichten des UIView während der Konstruktion zu entfernen.

Überschreiben Sie alle Methoden, die möglicherweise ausgeführt werden? Wie bei AddSubView oder möglicherweise Layoutsubviews? Wenn eine davon Unteransicht entzieht, würde dies das Problem verursachen.

Andere Tipps

Ist es möglich, dass Ihre Ansicht einen Unterschicht hat, in dem Sie den Delegierten als Ansicht zugewiesen haben? Dies würde normalerweise dazu führen, dass die Ansicht unendlich (gut, bis sie auf die Stapelgrenze traf), wenn sie aufrufen _makeSubtreePerformSelector:withObject:withObject:copySublayers:, Aber ich nehme an, es ist möglich, dass alles, was es hier versucht, Mutation beinhaltet.

Der Grund dafür ist, dass UIView davon ausgeht, dass Calayer, wenn ein Calayer -Delegierter ein UIView ist, dieser Calayer zur UIView gehört und die UIView Teil der Hierarchie ist. Wenn Sie jedoch Ihren eigenen Calayer erstellen und dem Delegierten als UIView zuweisen, ruft sich die UIView als Teil der Rekursion an.

Aus der Dokumentation:

Die Aufzählung ist „sicher“ - der Enumerator hat einen Mutationsschutz, so dass, wenn Sie versuchen, die Sammlung während der Aufzählung zu ändern, eine Ausnahme erhöht.

Grundsätzlich bedeutet dies, dass Sie keine Objekte zu einer Sammlung hinzufügen/entfernen dürfen (z. B. ein Array), während Sie sie unter Verwendung der in Objective-C 2.0 eingeführten schnellen Aufzählung aufzählen. Denn dies wird die Mutationsgarde ungültig machen.

In Ihrem Fall bezieht sich die Sammlung mit einer View -Hierarchie. Wenn Sie dieser bestimmten Sammlung Ansichten hinzufügen und/oder entfernen möchten, verwenden Sie keine schnelle Aufzählung.

Ich habe dies in Calayers gesehen, wenn Sie versuchen, eine Eigenschaft während der Calayer -Dealloc -Methode zu beseitigen, wodurch nur die Eigenschaft eine sichtbare Eigenschaft der Ebene verändert. Sie können überprüfen und sehen, ob Sie irgendwie etwas tun, das die Eigenschaften einer Ihrer Ansichten während der Dealloc derselben Ansicht verändert.

Ich habe den gleichen Fehler getroffen. Ich mutierte die Sichthierarchie auf einem Nicht-Main-Thread. Stellen Sie sicher, dass alle Änderungen an der Ansicht am Hauptfaden durchgeführt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top