viewDidUnload
is deprecated. Quindi, indipendentemente da ARC, non solo non ne hai bisogno, ma non dovresti usarne uno. La giustificazione dichiarata è che i punti di vista non vengono più eliminati dagli avvertimenti di memoria insufficiente (presumibilmente perché ora contribuiscono troppo poco al totale per meritare il colpo di risposta); Non sarei sorpreso se parte della giustificazione fosse che molte persone pensavano che avrebbero potuto rilasciare tutte le risorse create in viewDidLoad
all'interno di viewDidUnload
e che da sole avrebbero impedito le perdite. Ciò non è vero perché viewDidUnload
è chiamato solo se la vista viene scaricata a causa di un avviso di memoria insufficiente. Non è chiamato nel normale ciclo di vita.
Sotto ARC's new rules:
Si può implementare un metodo dealloc se avete bisogno di gestire le risorse diversi da rilasciare variabili di istanza. Non è necessario a (anzi non si può) rilasciare le variabili di istanza
EDIT: per commentare 4.3+ specificamente ...
ARC non attuerà una versione di viewDidUnload
per voi.Il punto del ciclo viewDidLoad
/viewDidUnload
consisteva nel fatto che se si sostituisce una qualsiasi parte della gerarchia della vista per qualsiasi motivo, si verificherà che non venga rilasciato automaticamente in seguito a un avviso di memoria insufficiente, ma in tal caso non si otterrà alcun beneficio perché non appena la vista viene caricata, qualunque cosa tu abbia conservato verrà sostituita con una nuova copia. Quindi, se hai strong
IBOutlet
s per le viste che si trovano all'interno della gerarchia sotto self.view
comunque idealmente le annulleresti durante il periodo viewDidUnload
. Anche se hai riferimenti weak
, è un buon posto per evitare di portare avanti eventuali puntatori penzolanti.
A partire da iOS 5 è possibile avere riferimenti deboli a zero automatico, quindi l'utilizzo di quelli e non l'implementazione di viewDidUnload
sarebbe la strada da percorrere se si supportava 5+. Per 4.3 se si utilizzano riferimenti forti e si omette lo viewDidUnload
, si potrebbe finire per impedire una risposta esauriente a un avviso di memoria insufficiente come vorrebbe Apple ma non si verificherà alcuna perdita di memoria. Se utilizzi riferimenti deboli, devi essere un po 'cauto nel non riferirti a nessuno di quegli oggetti nei momenti in cui potresti non avere una vista (cioè, ogni volta che non sei in mostra ma la vista è già stata caricata in precedenza - setter sul controller che regola anche una vista ma che sono influenzati da un altro sono un classico esempio, come dire se stavi aggiornando un campo con l'osservazione dei valori-chiave).
È possibile utilizzare "Simula memoria avviso" del simulatore per testare e eseguire il debug di tali elementi in misura limitata.
Il dealloc
che ARC fornisce sarà lo stesso indipendentemente dalla versione di iOS. Tuttavia coprirà solo oggetti Objective-C. Quando dicono che non è possibile rilasciare variabili di istanza, significa che nel senso letterale di inviare il messaggio release
a loro. Supponendo che tu abbia oggetti Core Foundation o che hai eseguito l'allocazione di memoria C pura, ti consigliamo di implementare uno dealloc
che disponga di tutti questi.
Ovviamente gli strumenti e lo strumento Perdite sono i modi per testare e eseguire il debug di quell'area; fare attenzione ogni volta che la memoria è trapelata per verificare se il tipo di oggetto che ha creato quella memoria viene anche trapelato. L'oggetto immediato può andare bene ma le sue allocazioni appariranno nell'elenco trapelato se non lo fosse dealloc
perché qualcun altro l'ha fatto trapelare.
Siamo spiacenti, @ Tommy, non sono stato abbastanza chiaro nella mia domanda sulla versione iOS di destinazione. Aggiornerà la domanda in base alla tua risposta. :) – tychoD
Grazie, questo ha risposto alla mia domanda. : D – tychoD
devo annullare tutti i miei @properties nel dealloc()? –