2 votes

Placement des méthodes de la super classe dans la classe enfant

Duplicata possible :
Quand dois-je appeler Super ?

Existe-t-il une différence/une préférence pour les appels aux méthodes de la super classe comme [super viewDidLoad] o [super init] o [super viewDidUnload] ? J'ai vu des tutoriels les placer soit en première ligne, soit en dernière ligne d'une méthode de classe enfant. Je me demande simplement s'il y a une dépendance, par exemple si la méthode de la super classe effectue une configuration que l'enfant peut utiliser. lorsqu'il est appelé en amont ou si le super peut faire des optimisations sur quelque chose que l'enfant a fait. lorsqu'il est appelé à la fin .

4voto

justin Points 72871

Ma règle générale est que les actes de construction/création appellent à travers super d'abord, tandis que les actes de destruction ou de démantèlement de l'État se produisent dans l'ordre inverse -- super est appelé en dernier. Il est rarement nécessaire de s'en écarter.

La raison n'est pas typiquement l'optimisation (comme demandé dans votre post), mais la prévisibilité. sémantique .

Exemple A :

construction :

- (id)init
{
  self = [super init]; // << set up super
  if (0 != self) {
    // set up self
  ...

destruction :

- (void)dealloc
{
  [ivar release], ivar = 0; // << tear down self
  [super dealloc]; // << tear down super

Exemple B :

construction :

- (void)viewWillAppear:(BOOL)pAnimated
{
  [super viewWillAppear:pAnimated]; // << call through super first
  // now set up self
  ...

destruction :

- (void)viewDidDisappear:(BOOL)pAnimated
{
  // tear down self
  [super viewDidDisappear:pAnimated]; // << now tear down super

0voto

Alex Brown Points 15776

Vous devez initialiser le super premièrement parce que le super constructeur a la possibilité de retourner une valeur autre que la valeur originale de self .

self = [super init];

Si vous initialisez d'autres propriétés de self avant d'appeler [super init] ces modifications peuvent être effacées.

Mais à quoi ça sert ?

@Justin note que les Class Clusters (utilisés pour renvoyer des instances de NSDictionary ou NSString) utilisent ce mécanisme pour fournir une sous-classe légèrement différente en fonction de la tâche. Les singletons peuvent également utiliser ce mécanisme, et la fonction (maintenant obsolète) Pose d'Objective-C le pourrait également.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X