2010-07-26 11 views
9

Ho inserito NSLog(@"%@::%@", [[self class] description], NSStringFromSelector(_cmd)); in viewDidLoad e viewDidUnload di un controller di visualizzazione.Perché viewDidUnload viene chiamato meno spesso di viewDidLoad?

Nel registro, ho trovato viewDidLoad è chiamato molto più di viewDidUnload quando l'app si sposta da e verso diversi .nibs.

Perché?

+0

Mi chiedo solo se la mia risposta sarà accettata, avrò +50 repu, giusto? Perché non l'ho ricevuto? – vodkhang

+0

@vodkhang, colpa mia. Non mi sono reso conto che devo fare clic su Accetta e l'icona '+ 50'. – ohho

risposta

17

viewDidLoad e viewDidUnload non corrispondono l'uno all'altro.

Il viewDidUnload verrà chiamato solo quando si riceve un avviso di memoria. Il sistema chiamerà quindi automaticamente viewDidUnload.

Nel caso normale, quando si preme un MyViewController e si spegne. La volontà ciclo vitale Succede così:

init 

viewDidLoad 

release 

Ciò significa, quando init e spinta/presentano una vista, un viewDidLoad sarà chiamato. Ma quando si apre la vista, la versione verrà richiamata in caso normale e viewDidUnload verrà chiamato in memoria.

Questo è abbastanza implicito e Apple non lo indica chiaramente sulla Guida. Ecco alcuni riferimenti: Load and Unload cycle

+0

Allora qual è la differenza tra viewDidUnload e didRecieveMemoryWarning? –

+0

Per prima cosa, l'applicazione riceve un avviso di memoria insufficiente dal sistema. Quindi ciascun controller di visualizzazione chiama il suo metodo didReceiveMemoryWarning. Quindi, se il controller della vista rilascia la sua vista, chiama il suo metodo viewDidUnload. È possibile sovrascrivere questo metodo per eseguire qualsiasi ulteriore pulizia richiesta per le viste e la gerarchia delle viste. – vodkhang

+0

Guarda di nuovo il ciclo Load and Unload – vodkhang

1

Immagino che nei casi in cui non è stato chiamato -viewDidUnload, il controller di visualizzazione è stato rilasciato. Vista carichi di controller

  • viewDidUnload::

    1. viewDidLoad avviso di memoria, controller di scarica vista
    2. viewDidLoad: carichi controller della vista di nuovo
    3. -: regolatore viene rilasciato, non scarica in modo esplicito la vista

    Tu e su con 2 chiamate -viewDidLoad e 1 chiamata `-viewDidUnload '.

    Forse anche mettere un NSLog nel metodo -dealloc e vedere se il numero di -dealloc e -viewDidUnload chiamate combinate corrisponde al numero di -viewDidLoad chiamate.

  • 0

    quando viene caricata una nuova vista, la vista precedente può ancora essere caricata in background. si sta cercando viewWillAppear come componente di riferimento, credo.

    visualizzazione scaricare solo in caso di una memoria.

    Problemi correlati