UIViewController -dealloc méthode n'est pas appelée
Je suis en train de travailler avec Automatique de Comptage de Référence.
J'ai un custom UIViewController
sous-classe et à chaque fois que j'appelle -presentViewController: animated:completion:
ou de retirer son avis de la superview je voudrais NSLog
quelque chose comme "je suis dealloced" donc je sais que le point de vue du contrôleur a été supprimé avec succès. J'ai mis en œuvre la -dealloc
méthode de mon point de vue contrôleur. Cependant, j'ai commencé un projet de test où j'ai juste eu deux UIViewController
cas (pas de conserver les cycles) et -dealloc
n'est pas appelé lorsque j'appuie sur le deuxième UIViewController
modal ou quand j'enlève le superview ou lorsque je le supprime de la vue parent contrôleur. Ai-je raté quelque chose ? Dans mon projet d'origine (pas le cas de test) Instruments montre-moi que ces contrôleurs de laisser une empreinte mémoire que je ne peux pas vous débarrasser de.
-viewDidDisappear:
fonctionne, mais est-ce à indiquer la méthode de libération de la mémoire ?Je n'ai jamais eu NSZombieEnabled et je pense que ce problème est résolu dans iOS6.
Il n'est pas clair du tout dans ce que vous avez posté sur Github ce que vous essayez de faire. La suppression d'un contrôleur de la vue de la fenêtre n'est pas désallouer le contrôleur. Vous devriez poster ici, un exemple de ce que vous faites -- montrer tout le code pour le contrôleur, vous pensez qu'il devrait être libéré. Il aide à voir les choses dans leur contexte.
J'ai pensé à enlever le contrôleur du point de vue de libérer le contrôleur ainsi... Mais oui, je suis en train de réellement se débarrasser de toute contrôleur non seulement la vue, de sorte que le point de vue du contrôleur reçoit dealloced.
Comment vous faites cela dépend beaucoup de votre structure. Rejetant présenté un contrôleur, ou sauter un contrôleur hors tension d'une pile de navigation, les deux devraient cause de libération de la mémoire. Aussi, si vous venez de passer de la vue de la racine de contrôleur de la fenêtre, et le vôtre est celui que vous êtes en s'éloignant d', qui va également provoquer d'être libéré.
OriginalL'auteur the_critic | 2013-05-04
Vous devez vous connecter pour publier un commentaire.
Si vous voulez changer de vue des contrôleurs, et ont de celui que vous êtes en s'éloignant d'être libéré, puis il suffit de passer de la vue de la racine de contrôleur de la fenêtre. Donc, si vous êtes dans le VC1 et que vous voulez aller à VC2, puis le faire en VC1:
Si vous n'avez pas créé de toute propriété à point à vc1, alors il sera libéré après avoir fait de ce changement.
Si vous souhaitez utiliser un modal présentation ou d'un modal segue (pour obtenir de l'animation lorsque vous contrôleurs de commutation), vous pouvez toujours obtenir le contrôleur initiale d'être libéré par la commutation de la vue racine contrôleur après la présentation de la viewDidAppear méthode de vc2:
OriginalL'auteur rdelmar
Pour obtenir une impression lorsque le Contrôleur est libérée, vous pouvez mettre en œuvre la méthode dealloc comme
Alors d'obtenir un imprimé lorsque la Vue-Contrôleur à gauche de l'affichage vous pouvez mettre en œuvre
-dealloc
. Le problème est, il n'est pas appelé à tous les...OriginalL'auteur Groot
Si vous utilisez
-presentViewController:animated:completion:
vous faites de la rétention de la parentViewController chaque fois que vous appelez cette méthode. ModalViewControllers sont tout simplement poussé sur le dessus de l'autre ViewController.ModalViewControllers sont uniquement conçus pour certains types d'informations ou de la Saisie de l'Utilisateur et des trucs comme ça. Si vous voulez dealloc la ParentViewController vous avez à traiter avec votre propre mise en œuvre.
-presentViewController:animated:completion:
méthode. J'ai juste essayé de donner des exemples de mon cas. En réalité je viens d'ajouter la vue de ma coutume VC à l'autre superview qui n'est pas connecté à l'ancien VC.pouvez-vous donner une sorte d'exemple de code (gist.github.com)?
Bien sûr, vous y allez: gist.github.com/anonymous/93242d562263bbf132eb
Essayez de regarder des instruments. Le problème ici est que vous ne retirez le point de vue de la superview et le ViewController est retenu par un autre Objet. La meilleure façon de résoudre ce problème est à chercher dans les instruments et la recherche de la conserver et de rejets qui sont appelée sur l'objet.
Ok, merci mariusLAN. Je ne suis pas particulièrement familier avec les Instruments, instrument qui dois-je utiliser pour voir la conserve/sorties ?
OriginalL'auteur mariusLAN
dealloc méthode n'est pas appelée lorsque la classe est conservé (ou quelque chose dans cette classe est conservé) et pas reeleased. C'est justement pour des projets ARC et sans elle. Donc, vérifiez votre code deux fois.
OriginalL'auteur user2159978