problem - iphone storage other
¿Qué debo hacer exactamente en viewDidUnload? (3)
Tiendo a publicar mis cosas en -dealloc, y ahora iPhone OS 3.0 introdujo este método divertido -viewDidUnload, donde dicen:
// Libera cualquier subvista retenida de la vista principal. // eg self.myOutlet = nil;
Entonces -viewDidUnload parece ser llamado cuando la vista del controlador de vista ha sido arrancada de la memoria. Y si tengo subvistas adjuntas a la vista principal del controlador de vista, tengo que liberar eso solo AQUÍ, pero no también en -dealloc.
Eso es confuso Además, ¿qué ocurre si -dealloc hace que la vista se descargue (libere)? Entonces otra vez, llamará -viewDidUnload?
Me doy cuenta de la diferencia, que -viewDidUnload es solo para el caso en el que la vista se mata, pero el controlador de vista permanece en la memoria. Y -dealloc es para el caso en el que todo se desperdicia.
Tal vez alguien pueda aclarar la confusión.
Como dices, viewDidUnload se llamará self.view = nil, esto generalmente ocurre si obtienes una advertencia de memoria. En este método, debe liberar cualquier subvista de la vista principal que pueda crearse fácilmente con el método .xib o loadView. Debería liberar cualquier objeto de datos si los crea en viewDidload o loadView, etc., ya que estos métodos serán llamados de nuevo para presentar la vista al usuario, esos datos pueden recrearse fácilmente.
Cuando recibe una advertencia de memoria, generalmente el viewcontroller descargará su vista, pero no será tratable.
Todo lo que se puede volver a crear fácilmente debe descargarse, pero no el modelo de la vista.
La intención aquí es "equilibrar" la gestión de su subvista. Todo lo que crees en viewDidLoad
debe liberar en viewDidUnload
. Esto hace que sea más fácil hacer un seguimiento de lo que se debe liberar donde. En la mayoría de los casos, su método dealloc
es una imagen especular de su método init
, y su viewDidUnload
será una imagen espejo de su método viewDidLoad
.
Como señaló, los métodos viewDid
... se deben usar cuando la vista misma se carga y descarga. Esto permite un patrón de uso en el que el controlador de vista permanece cargado en la memoria, pero la vista en sí misma puede cargarse y descargarse según sea necesario:
init
viewDidLoad
viewDidUnload
viewDidLoad
viewDidUnload
...
dealloc
Por supuesto, no hace daño liberar cosas en su método dealloc
también, siempre y cuando las configure en nil
cuando las libere en viewDidUnload
.
La siguiente cita de la sección Gestión de memoria de la documentación de UIViewController
de Apple, la describe con más detalle:
... en iPhone OS 3.0 y posterior, el método viewDidUnload puede ser un lugar más apropiado para la mayoría de las necesidades.
Cuando se produce una advertencia de poca memoria, la clase UIViewController purga sus vistas si sabe que puede volver a cargarlas o volver a crearlas más tarde. Si esto ocurre, también llama al método viewDidUnload para darle al código la oportunidad de renunciar a la propiedad de cualquier objeto asociado con su jerarquía de vistas, incluidos los objetos cargados con el archivo nib, los objetos creados en su método viewDidLoad y los objetos creados de forma perezosa en tiempo de ejecución y agregado a la jerarquía de vista. Normalmente, si su controlador de vista contiene puntos de venta (propiedades o variables sin formato que contienen la palabra clave IBOutlet), debe usar el método viewDidUnload para renunciar a la propiedad de esos puntos de venta o cualquier otro dato relacionado con la vista que ya no necesite.