2012-02-08 2 views
0

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?

Répondre

0

Oui, il vous manquera lorsque la méthode dealloc de nextController est invoquée, elle libèrera son contrôleur de navigation. Ainsi, lorsque vous lancerez navController, il libérera tous ses contrôleurs de vue poussés et ils libéreront leur navController. En d'autres termes, lorsque vous relâchez un contrôleur de navigation (en supposant que le nombre de versions est égal à zéro), tous les contrôleurs de vue activés sont activés.

+0

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

+0

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

+1

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

0

si vous avez déjà un contrôleur de navigation et appuyez sur un viewcontroller à l'intérieur vous pouvez alors utiliser cette propriété pour traiter le contrôleur de navigation .. par exemple

UIViewController *vc = [[UIViewController alloc] init]; 
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:vc]; 

maintenant vous êtes avoir votre vc à l'intérieur du contrôleur de navigation .. si vous voulez montrer une autre vc vous pouvez le faire comme ça [vc.navigationController pushViewController:detailViewController animated:YES];

pour la version que vous avez juste besoin [vc release]; [navController realese];

Questions connexes