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.
Suoni eccezionali, ma '-initWithCoder:' non viene chiamato su UIViewControllers. – CodaFi
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
in entrambi i casi si ottiene anche '-awakeFromNib' quando si carica da uno storyboard. – jackslash