2010-11-24 10 views
0

Excuses pour le gros bloc 'o' texte, mais je suis un peu un débutant ayant un jeu avec l'utilisation d'un UINavigationController dans le cadre d'une application que j'écris et Je me demandais comment je devrais gérer l'ajout de contrôleurs de vue à un UINavigationController et quand (si jamais) je devrais les libérer.UINavigationController - Quand libérer les contrôleurs de vue poussés, etc

Comme je le vois, il y a deux approches possibles lors de l'ajout d'un contrôleur de vue:

  1. Avoir une variable d'instance pour chaque contrôleur de vue de la classe dirigeante. Initialisez-le (si la variable d'instance est nulle) avant de le pousser sur le contrôleur de navigation. Libérez ensuite le contrôleur de vue dans la méthode dealloc de la classe de gestion si elle n'est pas nulle.

  2. Créez le contrôleur de vue en tant que variable locale dans une méthode et poussez-le sur le contrôleur de navigation avant de le relâcher immédiatement.

Cependant, je ne suis pas sûr de la validité de chacun d'entre eux. (Mon instinct est d'aller avec l'approche variable d'instance, mais peut-être que c'est dû à un manque de compréhension de ma part.)

Creuser un peu plus profond, je soupçonne que ma confusion est liée au fait que je ne ' Je ne sais pas si je suis responsable de l'élimination des contrôleurs de vue qui sont poussés sur la pile du contrôleur de navigation, ou si elle en disposera elle-même lorsqu'elle sera retirée de sa pile de contrôleurs de vue. (Par exemple: lorsque l'utilisateur clique sur le bouton 'back'.)

Si c'est le premier, alors je peux voir que je vais devoir utiliser l'approche de variable d'instance et implémenter les méthodes UINavigationControllerDelegate dans l'objet de gestion pour déterminer quand Je devrais libérer et annuler chaque contrôleur de vue, etc.

Enfin (pour les points bonus dans l'au-delà) comment pouvez-vous facilement savoir si une méthode va incrémenter le nombre de rétention d'un de ses paramètres? (Il ne semble pas y avoir d'indices dans la documentation, mais peut-être me manque quelque chose évidente.) Par exemple, quand j'utiliser quelque chose le long des lignes de ...

[[self navigationController] pushViewController:exampleVC animated:YES]; 

... Est-ce ce augmenter le nombre de retenue sur le contrôleur de vue? (Encore une fois, mon instinct est qu'il devrait, mais c'est à peu près autant d'utilisation qu'un garde-feu au chocolat en ces temps dangereux, etc.)

Merci d'avance.

Répondre

1

C'est assez simple. Si vous transférez un objet à un autre objet qui en fait quelque chose qui n'est pas sous votre contrôle direct, il retient l'objet que vous passez (à peu près tout fonctionne comme ça). Par exemple: Toutes les collections NSArray/Dictionary/Set conservent vos objets car si vous souhaitez libérer un objet contenu dans un tel enregistrement, certaines entrées ne seraient pas valides et la collection ne le connaîtrait pas.

Exactement la même chose est vraie pour les contrôleurs de navigation et autres choses, car vous ne savez pas si et quand votre viewcontroller est affiché ou mis au rebut.

+0

Merci pour l'heuristique - je n'y ai jamais pensé en ces termes. –

+0

Salut Dunkelstern, c'est un certain temps depuis ce post, mais pouvez-vous fournir un lien vers certains doc Apple mentionnant explicitement que l'objet passé est conservé. J'ai essayé et je suis d'accord avec cela, mais je n'ai trouvé aucune preuve à ce sujet.(La journalisation du nombre de sauvegardes pourrait l'avoir prouvé si les docs n'auraient pas mentionné que vous ne devriez jamais compter sur eux: P) – Sailesh

+0

Je crains que vous ayez à lire le "Guide des principes fondamentaux de Cocoa", il y a un chapitre "Comment gérer la mémoire Works "(http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW10) – Dunkelstern