2010-03-03 7 views
1

Quelque chose me fait réfléchir, après avoir traversé mon application avec des instruments, c'est une application UINavigationBased, il a remarqué cela.stratégie UINavigationController (iPhone)

Chaque fois qu'une cellule tableView est exploité et je fais ceci:

 GenericTableViewController *someViewController = [[Generic TableViewController alloc] init];  
     [self.navigationController pushViewController:someViewController animated:YES]; 
     [someViewController release]; 

Je puis appuyez sur le bouton en arrière et regarder d'instruments pour voir combien de cas la vie de l'GenericTableViewController existe là. Il y en a 1 avant le robinet arrière et 0 après. C'est super, bonne gestion de la mémoire propre par le UINavigationController. Cependant, d'autres endroits dans l'application, je n'utilise pas le bouton de retour pour laisser une vue, dans certains viewControllers tapant un de mes boutons personnalisés va exécuter du code complètement comme ci-dessus, mais le viewController, dans lequel j'ai tapé le bouton personnalisé, ne sera pas publié. Je suppose que je comprends pourquoi, le navigationController fait un appel de jugement, que je pourrais pousser quelque chose sur la pile et que je reviendrai plus tard, donc il garde le contrôleur dans sa mémoire. Cela doit signifier que l'appui sur le bouton de retour utilise un [self.navigationController popViewController]. D'accord.

Le problème est maintenant que chaque fois que je visite une vue qui ne reste pas en utilisant un bouton "retour" dans la barre de navigation, il ne sera pas publié. L'allocation de compte dans Instruments monte juste chaque fois que je visite une vue, jusqu'à ce que j'ai 20 objets vivant.

J'ai essayé de mettre un [self.navigationController popViewController] dans le sélecteur pour mes boutons personnalisés. Ce qui signifie que je lance manuellement le viewController visible avant de pousser un nouveau sur la pile. Mais le nombre d'allocations ne diminue pas? devinez le bouton "retour" n'utilise pas cette technique après tout ...

J'ai également essayé d'utiliser popToViewController, puisque je sais toujours si le contrôleur a été sur la pile ou non. Mais pour utiliser le popToViewController, je dois garder une référence autour de la vue. Y a-t-il une bonne façon de dire à l'UINavigationController: Si ce viewController est sur votre pile, veuillez l'afficher, sinon instanciez-le, poussez sur la pile et affichez-le. Le défi ici est probablement que toute ma navigation dans le NavigationController n'est pas complètement linéaire. Je devrai parfois partir de la pile. 2 pour empiler l'article 5, retour à 3 etc.

Y a-t-il un moyen de le faire, tout en ayant le UINavigationController en veillant à libérer mes viewControllers et à ne pas instancier plusieurs fois le même viewController?

Répondre

3

Vous pouvez essayer d'accéder à la propriété UINavigationController « s viewControllers pour obtenir un NSArray de tous les contrôleurs vue actuellement sur la pile de navigation. Ensuite, utilisez containsObject: pour vérifier si le contrôleur de vue est déjà sur la pile.
Si c'est le cas, utilisez popToViewController:animated: pour afficher le contrôleur de vue. Si ce n'est pas sur la pile, utilisez simplement pushViewController:animated:. Si cela ne vous aide pas, peut-être setViewControllers:animated: est la bonne méthode.

+0

Salut ChrisB Je n'ai pas pensé à utiliser la matrice de viewcontrollers pour tester manuellement si mon objet est sur la pile. Mis en œuvre correctement je devrais être capable de faire ce test aussi peu de fois que possible. Merci – RickiG

Questions connexes