Apple consiglia di non chiamare setter nelle routine init e in particolare dealloc.
Ciò è dovuto al fatto che l'oggetto è solo parzialmente impostato in questo momento, e i setter potrebbero avere osservatori collegati a loro, o potrebbero essere sovrascritti da sottoclassi, e altrimenti avere effetti indesiderati durante dealloc, o potrebbero essere confusi durante init con un oggetto parzialmente configurato.
Quindi, normalmente si usa:
_navigationController = [[NavController alloc] init];
codice di stile nella vostra routine init, codice
[_navigationController release];
stile nella vostra dealloc, e setter in altro codice in cui l'oggetto è noto per essere pienamente completare.
Alcuni casi da considerare:
- sottoclasse sovrascrive setNavigationController e riferimenti propri ivars assegnati da init. Crash su init.
- Sottoclasse sovrascrive setNavigationController e fa riferimento ai propri ivars rilasciati in dealloc. Crash su dealloc.
- Sottoclassi sostituisce setNavigationController e ridisegna alcune parti dello schermo. Spreco di cicli inutile o display difettoso.
- Altri oggetti essendo deallocati contemporaneamente osservare navigationController e quegli osservatori aziona durante dealloc
- ecc
fonte
2009-06-17 02:38:00
Grazie, quindi in questo caso il codice viewDidUnload avrebbe potuto essere utilizzato lo stesso codice dealloc per rilasciare l'oggetto, vale a dire [rilascio _navigationController] piuttosto che impostarlo su zero, giusto? – Boon
Sì, ma non farlo. Usa l'accessorio ovunque tranne in -dealloc. L'uso degli accessor in -dealloc è controverso per le ragioni che ha dato Daniel (Apple non è chiara su cosa raccomandano, anche). Prendi l'abitudine di liberare tutti i tuoi ivar conservati in -dealloc. Non scommettere su qualche altra cosa per farlo per te. E ogni volta che rilasci qualcosa, mettilo a zero. Gran parte di ObjC è senza una rete di sicurezza; le buone abitudini sono ciò che fa funzionare i tuoi programmi perché il compilatore non ti salverà. (OK, forse Clang ci salverà, ma useremo la sua energia per sempre.) –