ViewController respondsToSelector: message envoyé à désalloué instance (CRASH)
Ok, voici l'affaire, je haine de mettre des questions à propos de mon débogage et les accidents. Parce que j'ai l'habitude de gérer moi-même, mais je viens de ne peut pas obtenir mon chemin autour de cela, même après de l'affichage de plusieurs questions déjà.
Ok, donc voici le problème, j'ai trouver mon application de façon aléatoire sur et hors de la plante avec cette trace de la pile:
*** -[ViewController respondsToSelector:]: message sent to deallocated instance 0x1e5d2ef0
Où ViewController
peut varier, parfois, le lieu où mon code se bloque, a PAS pertinence de ViewController
et n'est pas propriétaire ou l'appeler.
Aussi, pour obtenir que la console de trace, je l'ai activé sur les Zombies, sinon je ne reçois pas de console d'impression à tous, je ne vous: objc_msgSend
, qui, je le sais je suis de messagerie quelque chose qui est publié. Mais je ne trouve pas où c'est... je suis vraiment coincé! Habituellement, je toujours debug mes plantages, donc je suis vraiment bloqué sur ce.
De nouveau, cette plante dans des endroits différents, à des moments différents, sur et en dehors. Et l'endroit où il se bloque a presque pas pertinence de la ViewController
. Et je trouve cela très confus.
Avez-vous besoin de mon code? J'ai beaucoup de fichiers et puisque c'est de s'écraser dans des endroits différents, la distribution de mon code sera un gâchis!
J'ai essayé d'ajouter de la symbolique des points d'arrêt avec pas de chance, et les Zombies ne sont pas disponibles sur les Instruments de l'application pour iOS. Je ne peux pas lancer mon application sur le simulateur comme il est indifférent à l'architecture cadre.
Merci à tout le monde...
- avez-vous cette question:stackoverflow.com/questions/1585688/...
- Oui je l'ai fait.......
- En supposant que la façon de faire la transition de votre point de vue est cohérent, peut-être que vous pouvez nous montrer un exemple ou deux. Si vous êtes en train de faire push standard/presentViewController des appels, vous devez être bien, mais je vois beaucoup de gens ici, faire des choses comme alloc/init avec un view controller, mais ne pas le faire un push/présent, mais plutôt de simplement ajouter le contrôleur est vue comme une sous-vue. Juste un hasard. Mais on ne peut pas diagnostiquer cela sans un peu de code. Espérons-le, quelques extraits nous aider à comprendre ce qui se passe, donc nous allons voir.
- Comment sur l'activation de la symbolique des points d'arrêt? Essayez d'ajouter ceux-ci: wiki.zemingo.com/index.php?title=Symbolic_Breakpoints
- J'utilise presentModalViewController, je n'ai pas l'ajouter comme une sous-vue
- Dans mon cas, mon enfant-vue-contrôleur contenait une webView, et l'enfant VC été le délégué pour la webView de la scrollView. J'avais besoin de supprimer manuellement le délégué de référence au cours de dealloc/viewWillDisappear ou j'ai eu ce crash. Espérons que cela aide quelqu'un.
Vous devez vous connecter pour publier un commentaire.
Utilisation Instruments pour traquer libéré instance erreurs. Le profil de votre application (Cmd ⌘+I) et choisissez Zombies modèle. Après que votre demande est en cours d'exécution, essayez de crash. Vous devriez obtenir quelque chose comme ça:
Cliquez sur la flèche à côté de l'adresse dans la liste de montrer l'objet qui a été appelé après qu'il a été libéré.
Vous devriez voir maintenant, à chaque appel, qui a changé de conserver compter de cet objet. Ce pourrait être parce que l'envoi directement à retenir/libération des messages ainsi que le drainage autorelease piscines ou les insérer dans NSArrays.
RefCt colonne montre retainCount après l'action a été invoqué et Responsable de l'Appelant montre nom de la classe et de la méthode dans laquelle elle a été effectuée. Lorsque vous double-cliquez sur n'importe quel retenir/release, instruments va vous montrer la ligne de code où cela a été effectuée (Si cela ne fonctionne pas, vous pouvez examiner l'appel en la sélectionnant et en choisissant son homologue Étendu Détail volet):
Cela vous permettra d'examiner tous les retainCount du cycle de vie de l'objet et probablement, vous trouverez votre problème immédiatement. Tous vous avez à faire est de trouver manquant conserver pour les dernières libération.
release
, en particulier. Le problème, c'est aucun déséquilibréerelease
. Je peux aussi être tout simplement un échec deretain
quelque chose qui vous tenez un pointeur et référence plus tard.Xcode 7.2
.a eu un problème similaire. Dans mon cas, un viewController nécessaire pour obtenir navigationController événements, c'était donc l'enregistrement en tant que la manette de navigation délégué:
L'incident se produit lorsque le contrôleur a été dealloc ed mais était encore le délégué de l'-vue-contrôleur. L'ajout de ce code dans le dealloc a eu aucun effet:
parce que au point que dealloc est appelé, la vue contrôleur a déjà été retiré de la vue de la hiérarchie, donc de soi.navigationController est nul, donc la comparaison est voué à l'échec! 🙁
La solution était d'ajouter ce code pour détecter la VC de quitter le point de vue de la hiérarchie de juste avant qu'elle ne fait donc. Il utilise une méthode introduit dans l'iOS 5 pour déterminer quand la vue est pop ed et ne les pousse pas
Ne plante plus!
Pour quelqu'un qui ne peut pas le résoudre, voici quelques autres techniques:
https://stackoverflow.com/a/12264647/539149
https://stackoverflow.com/a/5698635/539149
https://stackoverflow.com/a/9359792/539149
https://stackoverflow.com/a/15270549/539149
https://stackoverflow.com/a/12098735/539149
Vous pouvez exécuter des Instruments dans Xcode 5 en cliquant sur le projet popup->Modifier le Régime...Profil ->Instrument et choisir les Affectations ou les Fuites, puis le profil de votre application, puis arrêter Instruments, cliquez sur le bouton info de la répartition et de "Permettre NSZombie de Détection".
Toutefois, pour les messages qui proviennent directement de la com.apple.principal-thread, ce ne sera probablement pas révéler quoi que ce soit.
Je me suis cogné la tête sur ce pendant plus de deux heures et la réponse s'est avéré être une libération, que j'ai découvert en commentant une copie de mon projet par la force brute jusqu'à ce que j'ai trouvé le coupable:
Le problème est que la libération n'a pas défini la variable à NULL.
Qui signifie que le paramètre NULL appels libérer à nouveau, la décrémentation de la refcount et de libérer de la mémoire, jusqu'à ce que plus tard, lorsque les variables de référence viewController sont finis avec elle.
Donc, soit de permettre à l'ARC ou assurez-vous que votre projet utilise systématiquement la libération ou la valeur NULL, mais pas les deux. Ma préférence est d'utiliser la valeur NULL, car alors il n'y a aucune chance de référencement d'un zombie, mais il permet aussi de trouver où les objets sont libérés plus difficile.
J'avais rencontré le même problème dans iOS hier. J'ai fait PEI dans l'App "à Propos de" sous-vue, et j'ai ajouté de la Transaction Observateur dans "à Propos de" viewDidLoad. Quand je l'ai acheter pour la première fois, pas de problème, mais après j'ai le dos à la fenêtre principale et entrez sur sous-vue de l'achat de nouveau, le problème "message envoyé à désalloué instance" est arrivé, et l'Application s'est écrasé.
Après je retirer de la Transaction Observateur dans le dealloc, le problème est résolu.
zombie
objet dans des applis pour les achats. Après de nombreuses heures de creuser, j'ai trouvé celui-ci....Un GRAND MERCI à l'Homme.J'ai eu un problème similaire et j'ai compris que c'était dû à la navigation contrôleur de délégués fixé.
Ci-dessous résolu mon problème,
Eu le même problème sous OS X.
Pour résoudre ce pas assez
- (void)dealloc
méthode que @SoftwareEvolved déjà dit. Mais malheureusement- (void)viewWillDisappear
est disponible uniquement sur la version 10.10 et plus tard.J'ai introduit la méthode personnalisée dans mon NSViewController sous-classe où tous les zombies dangereux références à néant. Dans mon cas, c'était
NSTableView
propriétés (delegate
etdataSource
).C'est tout. Chaque fois que je suis sur le point de supprimer la vue à partir de la superview besoin d'appeler cette méthode.
J'ai eu le même Problème.Il était difficile de trouver délégué qui cause problème, car il n'indique pas la ligne de code d'instruction j'ai Donc essayer une certaine façon, Peut-être qu'il devient utile pour vous.