Question

Ceci est vraiment bizarre ...

Je lance mon application, et pendant son ouverture et les vues sont en train de construire je reçois:

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

La trace de code passe par les éléments suivants:

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

J'ai couru les lots de jeu et beaucoup, beaucoup de fois et je ne l'ai jamais vu cela, puis tout à coup, il surgit. La chose étrange est que je ne suis pas créer d'autres fils (que je connais) jusqu'à ce que après ce code tout est appelé. Ce sera plus facile pour moi de débugger si quelqu'un peut me donner une explication de ce qui pourrait être se modifier pendant qu'il est en cours d'accès UIView. At-il quelque chose à voir avec l'ajout de quelque chose à la vue alors qu'il est déjà ajouter quelque chose, peut-être? Toutes les idées?

Était-ce utile?

La solution

Il n'est pas une exception concurrency. mutation Enumeration exceptions se produisent lorsque quelque chose (peut-être dans une boucle dans le même fil) change le tableau / set / dictionnaire que la boucle est itération.

Depuis addSubview. Est sur la pile, je suppose que quelque chose tente d'enlever l'un des sous-vues du UIView lors de la construction

Êtes-vous outrepassant toutes les méthodes qui peuvent être se faire écraser? Comme addSubview ou peut-être layoutSubviews? Si l'un d'entre eux est la suppression des sous-vues, cela causerait le problème.

Autres conseils

Est-il possible que votre vue a une où vous avez attribué souscouche le délégué à la vue? Cela devrait normalement faire le point de vue de récursion infiniment (bien, jusqu'à ce qu'il a atteint la limite de la pile) lorsque vous appelez _makeSubtreePerformSelector:withObject:withObject:copySublayers:, mais je suppose qu'il est possible que ce qu'il essaie de faire ici implique une mutation.

La raison pour laquelle il en est ainsi parce que UIView suppose que si un délégué de CALayer est un UIView, alors que CALayer appartient à la UIView et la UIView fait partie de la hiérarchie. Toutefois, si vous créez votre propre CALayer et d'assigner le délégué à la UIView, le UIView finira par se faisant appeler dans le cadre de la récursion.

De la documentation:

Enumeration est « sûr » -le recenseur a un garde de mutation de sorte que si vous essayez de modifier la collection lors de l'énumération, une exception est levée.

En gros, cela signifie que vous n'êtes pas autorisé à ajouter / supprimer des objets à une collection (par exemple un tableau) pendant que vous énumérez à l'aide de l'énumération rapide introduite en Objective-C 2.0. car cela rendra invalide la garde de mutation.

Dans votre cas, la collection est liée à une hiérarchie de vue. Si vous voulez ajouter et / ou supprimer des vues à cette collection particulière, ne pas utiliser l'énumération rapide.

Je l'ai vu se produire dans CALayers lorsque vous essayez d'effacer une propriété au cours de la méthode -dealloc de CALayer, en changeant seulement la propriété modifie par inadvertance une propriété visible de la couche. Vous pouvez vérifier et voir si vous faites en quelque sorte quelque chose qui modifie les propriétés d'un de vos vues pendant la -dealloc de ce même point de vue.

Je frappe sur le même bug. Je la hiérarchie de muter vue sur un thread non principal. Assurez-vous que toutes les modifications de la vue sont effectuées sur le thread principal.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top