Un sacco di persone fraintendono il punto di viewDidUnload
. In particolare, è non la controparte di viewDidLoad
. Nella maggior parte dei casi, il controller della vista verrà deallocato senza chiamare viewDidUnload
. Per questo motivo, è necessario mai prendere in considerazione una deallocazione in viewDidUnload
un saldo corretto per un'allocazione in viewDidLoad
.
viewDidUnload
è stato deprecato da Apple. Forse il miglior argomento contro l'uso è il suo colpo di testa (che ho avvolto):
- (void)viewDidUnload NS_DEPRECATED_IOS(3_0,6_0); // Called after the view
// controller's view is released and set to nil. For example, a memory warning
// which causes the view to be purged. Not invoked as a result of -dealloc.`
Così che cosa era viewDidUnload
? L'idea alla base è che la vista viene scaricata da dietro il tuo controller di visualizzazione. Questo ti dà la possibilità di staccare qualsiasi suggerimento e cancellare tutte le informazioni che puoi ricostruire facilmente.La tua vista sarà probabilmente da ricaricare, a quel punto dovrai ricostruire qualsiasi cache. Apple lo descrive:
Quando si verifica una condizione di memoria insufficiente e le viste del controller di visualizzazione corrente non sono necessarie, il sistema può scegliere di rimuovere tali visualizzazioni dalla memoria. Questo metodo viene chiamato dopo che la vista del controller della vista è stata rilasciata ed è la tua possibilità di eseguire qualsiasi pulizia finale. Se il controller della vista memorizza riferimenti separati alla vista o alle sue sottoview, è necessario utilizzare questo metodo per rilasciare tali riferimenti. È inoltre possibile utilizzare questo metodo per rimuovere i riferimenti a tutti gli oggetti creati per supportare la vista ma che non sono più necessari ora che la vista non è più disponibile. Non utilizzare questo metodo per rilasciare dati utente o altre informazioni che non possono essere facilmente ricreate.
Ricordare che l'azzeramento dei riferimenti agli oggetti in viewDidUnload
non è necessario ora. Se stai usando ARC per i consigli di Apple, i tuoi punti di vista stanno azzerando i riferimenti deboli. Verranno automaticamente cancellati senza scrivere viewDidUnload
!
Inoltre, sgombrare informazioni caching si adatta meglio nel didReceiveMemoryWarning
, quindi probabilmente si dovrebbe scrivere invece:
È possibile ignorare questo metodo per rilasciare alcuna memoria aggiuntiva utilizzata dal controller della vista. Se lo fai, la tua implementazione di questo metodo deve chiamare la super implementazione a un certo punto per consentire al controller di visualizzazione di rilasciare la sua vista. Se il controller della vista contiene riferimenti alle viste nella gerarchia della vista, è necessario rilasciare tali riferimenti nel metodo viewDidUnload
.
In generale, la gente roba messi in viewDidUnload
sono gestite meglio in viewDidDisappear
o dealloc
. L'unica cosa rimasta per viewDidUnload
è l'azzeramento di qualsiasi cache che è possibile ricostruire senza perdita di dati mentre il controller di visualizzazione è ancora aperto, quando necessario a un certo punto dopo che la vista è stata ricaricata. (E, ancora, questo dovrebbe essere gestito in didReceiveMemoryWarning
.) Queste cache dovrebbero essere costruite pigramente; quando la tua app ne ha bisogno di nuovo, li ricostruirà tranquillamente.
Allora, cosa dovresti fare in viewDidUnload
? Se stai usando ARC: Nothing. Non scrivere nemmeno. Infatti, nel periodo di tempo in cui questa risposta è stata scritta, Apple ha dichiarato deprecato viewDidUnload
.
Per CGContextRelease
, la risorsa CGContext
non è un oggetto Objective-C. (L'hai fatto notare, ma voglio ripeterlo per i posteri.) Come tale, non può essere automaticamente scomposto da ARC. Sei responsabile di assicurarti che sia deallocated e nilled proprio come con il vecchio schema di gestione della memoria Release MRR (Manual Retain Release).
Se si inserisce questo codice in viewDidUnload
, non è garantito che venga mai chiamato. Deve andare in dealloc
. Si potrebbe metterlo in viewDidUnload
pure, ma ...
E così:
- non necessaria o utile. Le variabili di istanza sono minuscole rispetto alla gerarchia della vista.
- Non necessario o utile.Le tue proprietà sono minuscole rispetto alla gerarchia della vista (purché le tue proprietà non siano riferimenti forti nella gerarchia della vista).
- Ciò causerà una perdita di memoria, in quanto
dealloc
verrà normalmente chiamato senza viewDidUnload
.
- Non necessario o utile. Vedi punto 1 & 2.
Impostazione cose da zero nel viewDidUnload è ortogonale ad usare ARC o no, si tratta di rimozione di elementi non necessari durante il runtime per mantenere l'utilizzo totale della memoria della vostra applicazione più piccoli. Se non li rimuovi, alla fine verranno rimossi quando l'oggetto viene deallocato. Non è qualcosa di specifico per ARC. – Gruntcakes
quindi eseguiamo semplicemente 'CGContextRelease',' CGImageRelease', ecc. E non è necessario preoccuparsi di ivars e proprietà? –
In genere, non implementiamo viewDidUnload in ARC. Vedi la risposta qui per una spiegazione (per la risposta non-CG stuff): http://stackoverflow.com/questions/10853479/so-whats-the-deal-with-arc-and-releasing-properties-subviews-on- viewdidunload/10853926 # comment14137200_10853926 – Christian