20

Vorrei sapere se entrambi viewDidUnload e dealloc sono sempre chiamati in successione nel processo di rimozione di UIViewController. È possibile che dealloc possa essere chiamato sul mio controller di visualizzazione senza viewDidUnload chiamato prima?ViewDidUnload e dealloc vengono sempre chiamati quando si abbatte un UIViewController?

In entrambi i casi, se sto in sicurezza rilasciando la proprietà e conservati i riferimenti a entrambi i metodi che non sarebbe stato un problema se entrambi i metodi sono stati chiamati - ma mi chiedevo se qualcuno sapeva per certo o potrebbe far luce su il processo di demolizione.

2012 Aggiornamento: E 'utile notare che, come se iOS 6 viewDidUnload è stato deprecato e dovrebbe essere sostituito con manuale di vista teardown se necessario in didReceiveMemoryWarning.

Un buon articolo sul nuovo UIView/UIViewContoller e il nuovo comportamento ed i suoi effetti sulla joe conway blog

risposta

35

viewDidUnloadnon sarà essere chiamato ogni volta come dealloc metodo. viewDidUnload viene chiamato solo quando l'app riceve un avviso di memoria insufficiente!

Basti pensare, se si sta rilasciando il proprio oggetto sia nei metodi viewDidUnload e dealloc. Se entrambi vengono richiamati ogni volta, quindi stai rilasciando l'oggetto già rilasciato, che porterà al crash dell'applicazione, vero ?. viewDidUnload è un posto fornito da Apple per ripulire le cose quando si riceve l'avviso di memoria insufficiente perché sai che in iPhone abbiamo limitazioni di memoria.

+1

Credo che si intende 'viewDidUnload' quando si dice' viewDidLoad' nella vostra risposta. 'viewDidLoad' non viene chiamato quando c'è poca memoria, ma quando la vista apparirà sullo schermo (prima di' viewWillAppear'). 'viewDidUnload' viene chiamato quando c'è un avviso di memoria insufficiente. –

+0

Questa dovrebbe essere la risposta corretta. Questo mi ha messo nei guai oggi. – asandroq

+0

Sembra che sarebbe stato ok per fare self.whatever = nil all'interno di viewDidUnload e quindi chiamare [rilascio _whatever] all'interno di dealloc. In questo modo, se viewDidUnload viene chiamato per primo, l'oggetto non verrà sovrascritto da dealloc perché verrà annullato e il messaggio di rilascio verrà meno quando inviato a zero. Qualcuno può confermarlo? – jpswain

0

è abbastanza riflessivo che, il metodo viewDidiUnload ottenere chiamato solo quando appare avviso di memoria. Una buona pratica sarebbe quella di rilasciare il requisito dell'oggetto all'interno di questo metodo e anche rendere l'oggetto nullo.

Problemi correlati