20

Me gustaría saber si viewDidUnload y dealloc son siempre llamados sucesivamente en el proceso de eliminación de UIViewController. ¿Es posible que se haya llamado al dealloc en mi controlador de vista sin haber llamado primero al viewDidUnload?¿Se invoca siempre a viewDidUnload y dealloc cuando se destruye un UIViewController?

En cualquier caso, si estoy liberando de forma segura las propiedades y las referencias retenidas en ambos métodos, no sería un problema si se llamaran ambos métodos, pero me preguntaba si alguien estaba seguro o podría arrojar algo de luz sobre el proceso de derribo.

2012 Actualización: Es muy útil tener en cuenta que, como si de iOS 6 viewDidUnload ha quedado obsoleto y debe ser reemplazado con vistas al desmontaje manual de , si es necesario en didReceiveMemoryWarning.

Un buen artículo sobre la nueva UIView/UIViewContoller y el nuevo comportamiento y sus efectos en la joe conway blog

Respuesta

35

viewDidUnloadno se ser llamados cada vez que dealloc como método. viewDidUnload se invoca solo cuando su aplicación recibe una advertencia de memoria baja.

Solo piense, si está liberando su objeto en los métodos viewDidUnload y dealloc. Si ambos reciben llamadas cada vez, entonces estás liberando un objeto ya liberado, lo que provocará un bloqueo de la aplicación, ¿no? viewDidUnload es un lugar proporcionado por Apple para limpiar las cosas al recibir la advertencia de poca memoria porque sabes que en iPhone tenemos restricciones de memoria.

+1

Creo que te refieres a 'viewDidUnload' cuando dices' viewDidLoad' en tu respuesta. 'viewDidLoad' no se llama cuando hay poca memoria, pero cuando la vista aparecerá en pantalla (antes de' viewWillAppear'). 'viewDidUnload' se invoca cuando hay una advertencia de poca memoria. –

+0

Esta debería haber sido la respuesta correcta. Esto me metió en problemas hoy. – asandroq

+0

Parece que estaría bien hacer self.whatever = nil dentro de viewDidUnload y luego llamar a [_whatever release] dentro de dealloc. De esta forma, si viewDidUnload se llama primero, entonces dealloc no liberará el elemento porque se eliminará y el mensaje de lanzamiento simplemente desaparecerá cuando se envíe a cero. ¿Alguien puede confirmar esto? – jpswain

0

Es bastante reflexivo que, el método viewDidiUnload solo se llame cuando aparece la advertencia de memoria. Una buena práctica sería liberar el objeto requerido dentro de este método y también hacer que el objeto sea nulo.

Cuestiones relacionadas