2012-06-07 6 views
6

Per le app iOS, utilizzando ARC, normalmente le rilasciamo in viewDidUnload?In iOS, usando ARC, è sufficiente impostare tutti i ivars e le proprietà su zero e rilasciare contesto, immagine, spazio colore in viewDidUnload?

  1. impostare tutte le variabili di istanza per nil

  2. insieme tutte le proprietà a nil

  3. uscita qualsiasi contesto mediante CGContextRelease, CGImage con CGImageRelease, e lo spazio colore con CGColorSpaceRelease (rilasciare qualsiasi non oggetto)

  4. nessuna attenzione speciale necessaria per NSMutableArray di NSSet elementi: basta impostare su NSMutableArray e NSSet su zero e ogni elemento verrà rilasciato automaticamente.

Queste operazioni gestiranno la maggior parte del rilascio di memoria in ARC? Ci sono altri elementi che devono essere rilasciati?

+0

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

+0

quindi eseguiamo semplicemente 'CGContextRelease',' CGImageRelease', ecc. E non è necessario preoccuparsi di ivars e proprietà? –

+0

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

risposta

1

viewDidUnload ha un nome complicato, è molto facile sapere cosa va lì se ci pensate correttamente.

La prima cosa che devi sapere è che i dispositivi iOS hanno un basso metodo di gestione della memoria. Ciò significa che quando il dispositivo ha bisogno di più memoria, controllerà da quale delle sue app può liberare memoria. Lo fa chiamando il metodo ViewDidUnload (che potrebbe essere chiamato in modo errato).

Quindi siete incoraggiati a impostare TUTTO che può essere ricostruito a zero qui. (Tutto ciò che hai creato nel viewdidload).

Le eccezioni sono quando non puoi davvero perdere un oggetto a causa del tempo necessario per ottenere i dati o qualcosa del genere.

Se non si implementa questo viewdidload, l'app si manterrà sugli oggetti e sugli oggetti e iOS non sarà in grado di liberare nulla da esso.

SO sostanzialmente come ho detto, rilasciare (impostando gli elementi che puntano a quegli oggetti su zero) tutto ciò che è possibile ricostruire in modo sicuro nel viewdidload. (che verrà sicuramente chiamato dopo che la vista è stata scaricata e vuole essere caricata di nuovo)

14

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ì:

  1. non necessaria o utile. Le variabili di istanza sono minuscole rispetto alla gerarchia della vista.
  2. 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).
  3. Ciò causerà una perdita di memoria, in quanto dealloc verrà normalmente chiamato senza viewDidUnload.
  4. Non necessario o utile. Vedi punto 1 & 2.
Problemi correlati