In genere quando sottoclasse da una classe UI
chiamerò l'inizializzatore della superclasse di interesse. Tuttavia, non sono sicuro dei dettagli di implementazione di NSObject
e sembra che non ci sia molto da fare in termini di membri vars, quindi mi chiedo: devo chiamare [super init]
se la mia sottoclasse estende NSObject
?Devo chiamare [super init] o [super initWithCoder], ecc. Per NSObject
risposta
Tecnicamente, no. Il documentation for -[NSObject init]
dice che
Il metodo
init
definito nella classeNSObject
non fa di inizializzazione; restituisce semplicementeself
.
Perché è documentato e, probabilmente, c'è già un mucchio di codice che si basa su di esso, questo fatto è altamente improbabile che il cambiamento nelle future versioni di Mac OS X.
Edit:BoltClock's a Unicorn porta un punto che vorrei rendere più iperbolico: il tempo totale risparmiato non chiamando il numero -[NSObject init]
per tutti quelli che eseguono il tuo programma è improbabile che superi il tempo di debugging che potresti subire se cambi mai la superclasse della tua classe in qualcosa diverso da NSObject
e dimentica di aggiungere una chiamata allo [super init]
.
Dal documentation, non sembra fare alcuna inizializzazione affatto:
Procedimento
init
definita nella classe NSObject fa nessuna inizializzazione; restituisce semplicementeself
.
suppongo che sarebbe stato innocuo non chiamare [super init]
, ma non c'è ragione per non seguire le convenzioni e, sai, lo chiamano nella sottoclasse comunque. Ad esempio, la sottoclasse potrebbe in futuro ereditare da un'altra classe, che potrebbe contenere la logica di inizializzazione nel proprio metodo -init
che la sottoclasse richiederà.
Basta chiamare uno degli inizializzatori designati di super
nell'implementazione perché è sufficiente eseguire ciò che è chiaro e corretto.