2009-05-09 5 views
59

Je vois un exemple de code avec [super viewDidLoad] appelé avant votre implémentation et après votre implémentation.`[super viewDidLoad]` convention

Je sais que vous n'avez pas toujours appeler super (comme on le voit dans beaucoup d'autres discussions). Lorsque vous l'appelez, est-ce prévu avant ou après le code?

Cela pourrait avoir des conséquences selon l'implémentation de super. Bien que vous ne devriez pas avoir à connaître l'implémentation de super pour écrire le vôtre.

Bien sûr, cela vaut pour toutes les méthodes de délégué UIViewControllers (willAppear, didAppear, etc ...)

Toute pensée?

+0

connexes: http://stackoverflow.com/questions/824695/do-i-always-have-to-call-super-viewdidload-in-the-viewdidload-method – cregox

Répondre

91

Ma règle de base est: si vous faites quelque chose lié à l'initialisation, appelez toujours la méthode de la super-classe de première (si vous allez l'appeler du tout). Cela donne à la super classe une chance de faire n'importe quelle configuration sur laquelle vous pourrez compter plus tard dans votre méthode. Si vous faites quelque chose en rapport avec la destruction, appelez la méthode de la super classe en dernier. Cela garantit que vous pouvez compter sur l'état de l'objet tout au long de l'exécution de votre méthode. Enfin, prenez tout autre cas au cas par cas. Par exemple, si vous gérez un événement, vous voulez probablement traiter l'événement en premier, et invoquer uniquement la méthode de la super classe si vous choisissez de ne pas gérer l'événement ou si vous l'avez modifié et que vous voulez le transmettre le long de l'événement chaîne.

+7

Bon conseil de Jason, et souvent des documents Apple responsabilité de sous-classeur quand c'est important. Par exemple. Quand un comportement crucial dépend d'un super appel, il est souvent mis en évidence dans la documentation. En général, si cela ne vous fait pas de mal, faites appel à super pour être en sécurité. – danielpunkass

+0

Merci, c'est assez logique et gentil de l'approche que je prenais. Je sous-classifiais mes propres cours et j'avais le choix de ce qu'il fallait faire. Je ne voulais pas violer la convention en exigeant une configuration avant/après viewDidLoad. –

+3

Bien sûr, c'est le contraire dans -dealloc, puisque vous pourriez avoir besoin d'utiliser quelque chose appartenant à la superclasse avant qu'elle ne soit désallouée. – mk12

0

Disons que vous avez 2 classes, un parent et un enfant. L'enfant hérite de Parent. Ils ont une méthode appelée greet qui retourne une chaîne.

Voici ce que la méthode mère ressemble à:

code:

-(NSString *)greet { 
return @"Hello"; 
} 

Nous voulons que l'enfant d'apprendre de ses parents. Nous utilisons donc super pour dire que nous saluons maman, mais avec nos propres petits ajouts aussi.

code: // Hérite de Parent

-(NSString *)greet { 
NSString *parentGreeting = [super greet]; 
return [parentGreeting stringByAppendingString:@", Mommy"] 
} 

Alors maintenant Parent salue "Bonjour", et l'enfant salue "Bonjour, maman". Plus tard, si nous changeons le salut des parents pour retourner juste "Salut", alors les deux classes seront affectées et vous aurez "Salut" et "Salut, Maman". Super est utilisé pour appeler une méthode telle que définie par une superclasse. Il est utilisé pour accéder aux méthodes qui ont été remplacées par des sous-classes afin que la classe puisse envelopper son propre code autour d'une méthode impliquée par la classe parente. C'est très pratique si vous faites une sorte d'héritage du tout.

Questions connexes