2013-03-19 11 views
30

Il controller della vista iniziale è caricato e ho bisogno di un NSArray per essere avviato, dovrei occuparmi di questo in un metodo awakeFromNib o in un metodo initWithCoder:? awakeFromNib sembra funzionare meglio, dato che non ho bisogno di restituire nulla, ma funziona come i file di pennini erano quelli che venivano usati correttamente? Non voglio usare un metodo che si spezzerà presto.Dovrei utilizzare awakeFromNib o initWithCoder qui?

E sarebbe initWithCoder: basta guardare come:

- (id)initWithCoder:(NSCoder *)decoder { 
    if (self = [super initWithCoder:decoder]) { 
     self.articles = [[NSMutableArray alloc] init]; 
    } 

    return self; 
} 

risposta

38

Il punto di -awakeFromNib è così che si può fare cose init quando si può essere sicuri che tutte le connessioni ad altri oggetti nel pennino sono state stabilite.

L'infrastruttura pennino in-carico invia un messaggio ad ogni awakeFromNib oggetto ricreato da un archivio pennino, ma solo dopo che tutti gli oggetti l'archivio sono stati caricati e inizializzati. Quando un oggetto riceve un messaggio WakeFromNib, è garantito che abbia tutte le sue connessioni di uscita e connessioni già stabilite.

Non dimenticare di chiamare super.

È improbabile che vada via in qualunque momento presto e se facesse così tanto codice lo usa che il periodo di transizione sarebbe lungo. Sì, il suo nome deriva dal vecchio formato di file "pennino" ma this stack overflow question cancella le differenze nelle estensioni dei file.

Quindi, in sintesi, entrambi i metodi funzioneranno per voi poiché state impostando una variabile di istanza interna per la classe. Si noti che all'interno dei metodi init (incluso -initWithCoder) potrebbe non essere sicuro utilizzare i metodi di setter nel caso in cui i setter si basano sul fatto che la classe sia completamente inizializzata (fonte video WWDC 2012 che passa all'obiettivo moderno-c). Un esempio sarebbe l'impostazione di una proprietà che fa riferimento a un altro oggetto nel file pennino.

Nelle sottoclassi UIViewController-initWithCoder viene chiamato solo quando si carica da uno storyboard. Come viene chiamato -awakeFromNib se si utilizzano gli storyboard o meno potrebbe essere più sensato utilizzarlo.

Un altro modello che si potrebbe prendere in considerazione è il pigro-getter:

-(NSMutableArray *)articles{ 
    if (_articles){ 
     return _articles; 
    } 
    _articles = [[NSMutableArray alloc] init]; 
    return _articles; 
} 

Il vantaggio di questo approccio è che se si voleva fare ulteriore configurazione alla matrice si può facilmente eliminare la matrice quando non si ne hai più bisogno e la prossima volta che accedi alla proprietà ne hai di nuovo uno nuovo.

+1

Suoni eccezionali, ma '-initWithCoder:' non viene chiamato su UIViewControllers. – CodaFi

+4

Ho inserito un punto di interruzione nel metodo 'initWithCoder' di una sottoclasse UIViewController che viene istanziata da uno storyboard e il debugger ha raggiunto il punto di interruzione. [I documenti] (http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ViewLoadingandUnloading/ViewLoadingandUnloading.html#//apple_ref/doc/uid/TP40007457-CH10) confermano questo comportamento. – Jeff

+0

in entrambi i casi si ottiene anche '-awakeFromNib' quando si carica da uno storyboard. – jackslash

Problemi correlati