2010-07-26 20 views
9

puse NSLog(@"%@::%@", [[self class] description], NSStringFromSelector(_cmd)); en ambos viewDidLoad y viewDidUnload de un controlador de vista.¿Por qué viewDidUnload se llama con menos frecuencia que viewDidLoad?

En el registro, encontré que viewDidLoad se llama mucho más que viewDidUnload cuando la aplicación se mueve ay desde diferentes .nibs.

¿Por qué?

+0

Me pregunto si mi respuesta es aceptada, tendré +50 reputación, ¿verdad? ¿Por qué no recibí eso? – vodkhang

+0

@ vodkhang, mi culpa. No me di cuenta de que tengo que hacer clic en Aceptar y en el icono '+50'. – ohho

Respuesta

17

viewDidLoad y viewDidUnload no se corresponden entre sí.

viewDidUnload solo se ejecutará cuando reciba una advertencia de memoria. El sistema llamará automáticamente a su viewDidUnload.

En el caso normal, cuando presiona un MyViewController y lo saca. La voluntad del ciclo de vida sucede así:

init 

viewDidLoad 

release 

Eso significa que, cada vez que init y empuje/presentan un punto de vista, será llamada viewDidLoad. Pero cuando abre la vista, se llamará a la versión en el caso normal y se llamará a viewDidUnload en el caso de advertencia de memoria.

Esto es bastante implícito y Apple no lo dice claramente en la Guía. Aquí hay alguna referencia: Load and Unload cycle

+0

Entonces, ¿cuál es la diferencia entre viewDidUnload y didRecieveMemoryWarning? –

+0

Primero, la aplicación recibe una advertencia de poca memoria del sistema. Luego, cada controlador de vista llama a su método didReceiveMemoryWarning. Entonces, si el controlador de vista libera su vista, llama a su método viewDidUnload. Puede anular este método para realizar cualquier limpieza adicional necesaria para sus vistas y ver la jerarquía. – vodkhang

+0

Mira el enlace de cargar y descargar de nuevo el ciclo – vodkhang

1

Imagino que en los casos en que no se llamó a -viewDidUnload, se liberó el controlador de vista.

  1. viewDidLoad: cargas controlador de vista
  2. viewDidUnload: advertencia de memoria, controlador de descarga el punto de vista
  3. viewDidLoad: cargas controlador de vista nuevo
  4. -: controlador se libera, no se descarga de forma explícita la vista

Usted y hasta con 2 -viewDidLoad llamadas y 1 `-viewDidUnload 'llamada.

Tal vez también poner un NSLog en el método -dealloc y ver si el número de llamadas -dealloc y -viewDidUnload combinados coincide con el número de llamadas -viewDidLoad.

0

cuando se carga una nueva vista, la vista anterior aún se puede cargar en segundo plano. estás buscando viewWillAppear como conterpart, creo.

vistas solo se descargan en caso de una advertencia de memoria.

Cuestiones relacionadas