3 votes

[CALayer retain]: message envoyé à une instance désallouée?

Dans mon application, lorsque je change de vue, après environ la 4ème fois que je change de vue, j'obtiens un crash qui dit :

*** -[CALayer retain]: message envoyé à une instance désaffectée 0x6c4ba0

J'ai NSZombieEnabled dans Xcode et il me pointe cette ligne à chaque fois qu'il change de vue:

[self.view removeFromSuperview];

Aussi, si je fais une backtrace du (gdb) cela me donne ceci :

#0  0x37dd68a0 in ___forwarding___ ()
#1  0x37d31680 in __forwarding_prep_0___ ()
#2   0x37d1d026 in CFRetain ()
#3   0x37d26bb2 in +[__NSArrayI __new::] ()
#4   0x37d26acc in -[__NSPlaceholderArray initWithObjects:count:] ()
#5   0x3518e680 in -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:] ()
#6   0x3518e7a4 in -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:] ()
#7  0x3534c40c in __UIViewWillBeRemovedFromSuperview ()
#8   0x3518dad0 in -[UIView(Hierarchy) removeFromSuperview] ()
#9   0x000368a6 in __block_global_1 (.block_descriptor=, finished=1 '\001') at /Users/bobsComputer/Desktop/Projects/NewApp/MyApp/MyApp3/MyApp3ViewController.mm:135
#10 0x351a70be in -[UIViewAnimationBlockDelegate _didEndBlockAnimation:finished:context:] ()
#11 0x351a181a in -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] ()
#12 0x351a6fb8 in -[UIViewAnimationState animationDidStop:finished:] ()
#13 0x3354fba6 in CA::Layer::run_animation_callbacks ()
#14 0x37a91f7a in _dispatch_main_queue_callback_4CF$VARIANT$mp ()
#15 0x37da72dc in __CFRunLoopRun ()
#16  0x37d2a4dc in CFRunLoopRunSpecific ()
#17  0x37d2a3a4 in CFRunLoopRunInMode ()
#18  0x378a8fcc in GSEventRunModal ()
#19  0x351ba742 in UIApplicationMain ()

Aussi voici comment je change de vues, j'ai un contrôleur de vue principal. Ensuite, j'utilise un parent de vue et des protocoles pour appeler ces méthodes depuis mes autres contrôleurs de vues. Ensuite, j'utilise des animations personnalisées d'UIView pour changer de vues.

Est-ce que quelqu'un a des idées sur la raison de ce crash ?

Merci !

4voto

bneely Points 4860

-[UIView addSubview:] provoque la rétention de la sous-vue, et -[UIView removeFromSuperview] entraîne la libération de la vue. Cela provient directement de la documentation Apple sur UIView. À ce stade, l'un de vos objets doit rétablir le CALayer sinon il sera désalloué.

J'ai supposé que le CALayer a été créé directement par vous. Tous les UIViews sont associés à des CALayers; le CALayer est ce dans quoi un UIView dessine, et ensuite son CALayer est composé sur l'écran. Si vous ne travaillez pas directement avec les CALayers, c'est le signe d'un autre problème.

Le problème central que vous décrivez est une libération excessive. Il est possible que vous ne réteniez pas un UIView lorsque vous devriez le faire. Je vous suggère de lancer l'analyseur Xcode (dans Xcode 4, choisissez le menu Produit > Analyser) et de voir ce qui est signalé. Portez une attention particulière à toutes les erreurs de gestion de mémoire signalées.

1voto

Mike M Points 932

J'ai eu le même problème. Je n'utilisais pas Interface Builder pour mes vues. La cause était qu'une sous-vue de la vue qui causait le crash était libérée deux fois (mais curieusement, elle ne plantait pas lors de la deuxième libération). Je vous suggère donc d'aller dans la méthode initWithFrame de la vue, ou n'importe où vous ajoutez vos sous-vues et de regarder attentivement chaque libération. Je n'implémente généralement pas la méthode dealloc puisque j'envoie un message autorelease à chaque sous-vue avant de l'ajouter à la vue parente. De cette façon, j'ai moins d'endroits à vérifier et je suis sûr que tout sera libéré une fois que la vue parente sera supprimée. J'espère que cela vous aidera...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X