2009-05-09 21 views
59

Veo un código de ejemplo con [super viewDidLoad] llamado antes de su implementación y después de su implementación.`[super viewDidLoad]` convención

Sé que no siempre es necesario llamar a super (como se ve en muchas otras discusiones). Cuando lo llamas, ¿se espera antes o después de codificar?

Esto podría tener consecuencias dependiendo de la implementación de super. Aunque no deberías tener que saber la implementación de Super para escribir la tuya.

Por supuesto, esto va para todos los métodos de delegado UIViewControllers (willAppear, didAppear, etc ...)

¿Alguna idea?

+0

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

Respuesta

91

Mi regla de oro es: si está haciendo algo relacionado con la inicialización, siempre llame primero al método de la superclase (si va a llamarlo). Esto le da a la súper clase la oportunidad de realizar cualquier configuración en la que pueda confiar más adelante en su método. Si estás haciendo algo relacionado con la destrucción, llama al último método de la superclase. Esto asegura que puede confiar en el estado del objeto durante la ejecución de su método. Finalmente, tome cualquier otro caso caso por caso. Por ejemplo, si está manejando un evento, probablemente quiera tratar primero con el evento y solo invocar el método de la superclase si elige no manejar el evento o si de alguna manera lo alteró y desea pasarlo a lo largo del evento. cadena.

+7

Un buen consejo de Jason y, a menudo, documentos de Apple responsabilidad de subclasser cuando es importante. P.ej. cuando algún comportamiento crucial depende de una súper llamada, a menudo se resalta en la documentación. En general, si no va a doler, simplemente llame a super para estar seguro. – danielpunkass

+0

Gracias, eso es bastante lógico y el tipo de enfoque que estaba tomando. Subclasé mis propias clases y tuve la opción de qué hacer. No quería violar las convenciones al requerir la configuración antes/después de viewDidLoad. –

+3

Por supuesto, es lo opuesto en -dealloc, ya que puede necesitar usar algo perteneciente a la superclase antes de desasignarse. – mk12

0

Digamos que tiene 2 clases, un padre y un hijo. El niño hereda de Parent. Tienen un método llamado greet que devuelve una cadena.

Esto es lo que el método de los padres se ve así:

Código:

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

Queremos que el niño aprenda de sus padres. Así que utilizamos súper para saludar a mamá, pero con nuestras pequeñas adiciones también.

Código: // hereda de los padres

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

Así que ahora los padres saluda "Hola", y el niño saluda "Hola, mamá". Más adelante, si cambiamos el saludo de los padres para que solo devuelva "Hola", ambas clases se verán afectadas y usted tendrá "Hola" y "Hola, mamá".

super se utiliza para llamar a un método tal como se define en una superclase. Se utiliza para acceder a los métodos que han sido modificados por subclases para que la clase pueda ajustar su propio código en un método que implemente su clase principal. Es muy útil si está haciendo algún tipo de herencia en absoluto.