2010-01-27 7 views
4

J'ai noté le code d'autres sources où l'auteur n'a pas ajouté les messages à super qui sont montrés ci-dessous. Je les ajoute habituellement tous les deux, mais j'étais simplement curieux de savoir ce qu'ils faisaient et ai-je raison de toujours les ajouter?ViewDidLoad/Décharger les messages à super?

-(void)viewDidLoad { 
    //... other code 
    [super viewDidLoad]; 
} 

-(void)viewDidUnload { 
    //... other code 
    [super viewDidUnload]; 
} 

gary

+0

EDIT: Je supposais que les deux méthodes incluraient également d'autres codes, j'ai ajouté // ... autre code pour le représenter dans les exemples ci-dessus. – fuzzygoat

+0

en relation: http://stackoverflow.com/questions/844195/super-viewdidload-convention – cregox

Répondre

4

Je recommande toujours envoyer des messages UIViewController délégué à super (par exemple viewDidLoad, viewDidAppear). Dans certains cas, il est inutile, si vous sous-classez UIViewController directement par exemple.

Certaines classes, par ex. UITableViewController, obligent les sous-classes à le faire, comme it is documented: "Vous pouvez substituer loadView ou toute autre méthode de superclasse, mais si vous êtes sûr d'invoquer l'implémentation de la superclasse de la méthode, généralement comme le premier appel de méthode."

L'appel à super permet à la super classe de gérer l'événement (par exemple, recharger les données de la table, animer la désélection du bouton, etc.). Inutile de dire que vous n'avez pas besoin d'une méthode explicite dont le seul travail consiste à appeler super.

1

Le but de ces méthodes est d'informer votre contrôleur lorsque la vue qu'il contrôle a terminé le chargement et le déchargement terminé, au cas où il y a des choses que le contrôleur doit accomplir dans ces « intéressants des moments".

Le code que vous avez inclus ne fait fondamentalement rien: il transmet les messages à l'implémentation de la super-classe, sans ajouter de traitement propre. Mais c'est exactement ce qui se passerait si ce code était entièrement omis: le message serait transmis à la classe la plus basse de la chaîne d'héritage qui définissait une implémentation pour la méthode.

0

Vous n'avez pas besoin de remplacer ces méthodes par une implémentation vide. Remplacez-le quand vous avez besoin de faire quelque chose avec ivars, arrêtez l'observation des notifications, etc. Votre code ne sert à rien

0

Vous ne devez remplacer une méthode que lorsque vous avez besoin d'effectuer une action, donc je suppose que votre code ressemble vraiment quelque chose comme ceci:

-(void)viewDidLoad { 
    //do things that need to be done when the view is loaded 
    [super viewDidLoad]; 
} 

Si vous pensez que le parent si votre point de vue doit faire quelque chose d'aussi bien, puis un appel à [super viewDidLoad]; est définitivement en ordre. Si vous regardez la documentation viewDidLoad, cependant, il déclare

Cette méthode est la plus couramment utilisée pour exécuter les étapes d'initialisation supplémentaires sur les vues qui sont chargés à partir de fichiers nib

Le mot « supplémentaire » ici est crucial: c'est juste une méthode de commodité. Ceci est en contraste avec dealloc, où la documentation indique explicitement que lors de l'annulation de dealloc vous devez toujours finir avec un appel à [super dealloc]. Si votre implémentation de viewDidLoad et viewDidUnload ne fait vraiment rien d'autre que d'appeler super, vous devez les supprimer: ils ne font rien en plus de faire du travail supplémentaire pour le compilateur.