La méthode UIViewController -dealloc n'est pas appelée

Je travaille avec le comptage automatique des references. J'ai une sous-class personnalisée UIViewController et chaque fois que j'appelle -presentViewController: animated:completion: ou supprime sa vue de la vue d'set je voudrais NSLog quelque chose comme "Je suis libéré" donc je sais que le controller de vue a été supprimé avec succès. J'ai implémenté la méthode -dealloc dans mon controller de vue. Cependant j'ai démarré un projet de test où je n'avais que deux instances de UIViewController (pas de cycles de retenue) et -dealloc n'est pas appelé quand je pousse UIViewController le second UIViewController ou quand je supprime le UIViewController aperçu ou quand je le retire du controller parent. Est-ce que je manque quelque chose? Dans mon projet original (pas le cas de test), Instruments me montre que ces controllers laissent une empreinte de memory dont je ne peux pas me débarrasser.

Si vous voulez basculer les controllers de vue, et que celui que vous quittez soit désalloué, changez simplement le controller de vue racine de la window. Donc, si vous êtes dans VC1 et que vous voulez aller à VC2, alors faites ceci dans VC1:

 VC2 *vc2 = [[VC2 alloc] init]; // or however else is appropriate to get an instance of this class self.view.window.rootViewController = vc2; 

Si vous n'avez créé aucune propriété pour pointer sur vc1, il sera désalloué après avoir effectué ce changement.

Si vous souhaitez utiliser une présentation modale ou une section modale (pour get l'animation lorsque vous changez de controller), vous pouvez toujours désallouer le controller initial en basculant le controller de vue racine après la présentation de la méthode viewDidAppear de vc2:

 -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; self.view.window.rootViewController = self; } 

Pour get une printing lorsque le View Controller est désalloué, vous pouvez implémenter la méthode dealloc

 - (void) dealloc { NSLog(@"The instance of MyViewController was deallocated"); } 

Ensuite, pour get une printing lorsque le controller de vue a quitté la vue, vous pouvez mettre en œuvre

 - (void) viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; NSLog(@"The instance of MyViewController left the main view") } 

Si vous utilisez -presentViewController:animated:completion: vous conservez le parentViewController chaque fois que vous appelez cette méthode. ModalViewControllers sont simplement poussés sur l'autre ViewController.

Les ModalViewControllers ne sont conçus que pour un type d'information / input user et autres. Si vous voulez libérer le ParentViewController, vous devez gérer votre propre implémentation.

La méthode dealloc n'est pas appelée lorsque la class est conservée (ou quelque chose dans cette class est conservée) et n'est pas rééditée. C'est juste pour les projets avec ARC et sans elle. Alors vérifiez votre code deux fois.