intérieur UIViewController il y a la propriété:Propriété UINavigationController iPhone/iPad dans UIViewController?
@property(nonatomic, readonly, retain) UINavigationController *navigationController
Je ne suis pas vraiment sûr comment est-ce bien utilisé ... Comme la façon dont je le vois, si vous avez contrôleur de navigation nommé NavController et tapez un code comme ceci:
[navController pushViewController:nextController animated:YES];
plusieurs choses se produisent. Le premier nextController est poussé sur la pile de navController. Deuxièmement, navController conserve nextController. Troisièmement, la propriété readonly de nextController (navigationController) est initialisée avec navController. Ainsi, navController conserve nextController et nextController conserve navController. Cela a pour conséquence que si vous libérez navController, il ne sera pas détruit car il est conservé par tous les UIViewControllers sur sa pile. La seule façon de le libérer est de faire éclater tous les objets de la pile, puis de les relâcher.
Est-ce ainsi que tout cela fonctionne, ou ai-je oublié quelque chose?
méthode de libération est appelée à l'intérieur méthode dealloc, qui est appelée lorsque le nombre de conserver objec t est zéro. Ainsi, si vous appelez release sur navController, son compte de retenue n'est pas nul (rappelez-vous que tous les UIViewControllers sur la pile le retiennent encore) et que sa méthode dealloc n'est pas appelée. Le problème est, dans la méthode dealloc de navController, tous les contrôleurs poussés sont libérés (quand vous les relâchez, tout le compte de retenue navController devrait être zéro, pas avant cela), mais cette méthode n'est jamais appelée. – MegaManX
Maintenant, je comprends le problème. Mais les choses fonctionnent bien et aucune fuite n'apparaît lorsque vous relâchez un contrôleur de navigation. Le contrôleur de vue conserver sur le contrôleur de navigation est temporel et seulement pendant que le contrôleur de navigation ajoute la sous-vue. – Gabriel
Plus à ce sujet. Je l'ai testé et lorsque vous appuyez sur un contrôleur de vue, vous obtenez un retainCount incrémenté pour le contrôleur de navigation, mais seulement jusqu'à la fin de cette boucle d'interface. Ensuite, gardez compte pour le contrôleur de navigation est de nouveau restauré avec sa valeur précédente. Il ne s'agit donc pas d'une réelle propriété de conservation pour les contrôleurs de vue. – Gabriel