2010-05-16 11 views
7
domanda

Chiarimento come un follow-up a:Follow-up viewDidUnload vs. dealloc domanda

What exactly must I do in viewDidUnload? When should I release objects in -(void)viewDidUnload rather than in -dealloc?

Quindi diciamo che c'è un errore di memoria insufficiente, e la vista è nascosto, e viewDidUnload si chiama. Facciamo il rilascio e nil balliamo. In seguito non è necessario l'intero stack di visualizzazione, quindi viene chiamato dealloc. Dal momento che ho già il rilascio e roba nil in viewDidUnload, non ce l'ho in dealloc. Perfezionare.

Ma se non c'è un errore di memoria insufficiente, viewDidUnload non viene mai chiamato. viene chiamato dealloc e dal momento che non ho il rilascio e la roba nil, c'è una perdita di memoria.

In altre parole, dealloc sarà mai chiamato senza viewDidUnload chiamato prima?

E il seguito pratico di ciò è che se alloco e imposta qualcosa in viewDidLoad, e lo rilascio e impostato su nil in viewDidUnload, lo lascio fuori da dealloc, oppure eseguo un controllo difensivo nullo in dealloc e rilascia/zero se non è zero?

+3

Sai che puoi inviare a nil un messaggio di rilascio senza problemi, giusto? nil semplicemente ignora tutti i messaggi inviati e restituisce nil come valore senza errori. Nessuna necessità di controlli difensivi per nil come con NULL –

risposta

8

Rilasciarlo in entrambi. Non è necessario controllare nulla. Rilasciare a zero non fa nulla.

Tuttavia in viewDidUnload non rilasciare ivars che non è possibile ricreare facilmente in viewDidLoad, nel caso in cui la vista venga nuovamente caricata.

Normalmente (nessun avviso di memoria) viewDidUnload non viene chiamato, viene chiamato solo dealloc.

+0

Per una buona igiene, un set nullo dovrebbe essere fatto in dealloc? – alyssackwan

+0

Per sicurezza si, ma posso solo pensare ad alcuni casi in cui è importante. Mi piace usare il setter per impostarlo su zero, poiché lo rilascia e lo imposta su zero in una riga (es .: self.ivar = nil;) – progrmr

+6

Non c'è davvero alcun motivo per impostare ivars su 'nil' in' dealloc'. Inoltre, è contro i consigli di Apple utilizzare i setter in 'dealloc' (cioè self.ivar = nil'), poiché potrebbe esserci un problema nell'usare setter in un oggetto parzialmente deallocato. Probabilmente non è un problema usare i setter, ma per essere sicuri al 100%, puoi usare '[ivar release]'. – shosti

Problemi correlati