¿Para qué -(void)viewDidUnloadsirve?
¿No podría simplemente relatar todo -dealloc? Si la vista se descargara, ¿no -deallocse llamaría de todos modos?
¿Para qué -(void)viewDidUnloadsirve?
¿No podría simplemente relatar todo -dealloc? Si la vista se descargara, ¿no -deallocse llamaría de todos modos?
Además de lo que ya se ha indicado, quería elaborar más sobre la lógica detrás -viewDidUnload.
Una de las razones más importantes para implementarlo es que las UIViewControllersubclases comúnmente también contienen referencias de propiedad a varias subvistas en la jerarquía de vistas. Estas propiedades podrían haberse establecido IBOutletsal cargar desde una plumilla, o mediante programación dentro -loadView, por ejemplo.
La propiedad adicional de las subvistas UIViewControllersignifica que incluso cuando su vista se elimina de la jerarquía de vistas y se libera para ahorrar memoria, a través de la cual las subvistas también son liberadas por la vista, en realidad no se desasignarán porque la UIViewControllerpropia vista todavía contiene sus propios pendientes. conservando referencias a esos objetos también. Liberar la UIViewControllerpropiedad adicional de estos objetos asegura que también se desasignarán para liberar memoria.
Los objetos que libera aquí generalmente se recrean y configuran nuevamente cuando la UIViewControllervista es re-loaded, ya sea desde un Nib o mediante una implementación de -loadView.
También tenga en cuenta que la UIViewController viewpropiedad es nilen el momento en que se llama a este método.
Como dice la documentación :
En la misma situación
deallocestá no llama. Este método solo está disponible en OS3 y versiones posteriores. ¡Tratar con la misma situación en iPhone OS 2.x fue un verdadero dolor!Actualización de julio de 2015 : debe tenerse en cuenta que
viewDidUnloadquedó obsoleto en iOS 6 porque "Las vistas ya no se purgan en condiciones de poca memoria, por lo que este método nunca se llama". Entonces, el consejo moderno es no preocuparse por él y usarlodealloc.fuente
Esto se debe a que normalmente configurará el
@propertycomo"(nonatomic, retain)"y, como tal, el establecedor que se crea para usted libera el objeto actual y luego retiene el argumento, es decir... hace algo como:
Por lo tanto, está matando dos pájaros de un tiro: administración de memoria (liberando el objeto existente) y asignando el puntero a nil (ya que enviar cualquier mensaje a un puntero nil devolverá nil).
Espero que ayude.
fuente
Recuerde que
viewDidUnloades un método en el controlador de vista, no en la vista. La de vistadeallocmétodo será llamado cuando la vista se descargue, pero la del controlador de vistadeallocmétodo no puede ser llamado hasta más tarde.Si recibe una advertencia de memoria baja y su vista no se muestra, lo que sucederá, por ejemplo, cada vez que use un UIImagePickerController para permitir que el usuario tome una foto, su vista se descargará y deberá volver a cargarla después de eso.
fuente
Conclusión:
Los controladores de vista tienen una propiedad de vista. Normalmente, una plumilla o un fragmento de código agrega otras vistas a esta vista. Esto sucede a menudo dentro de un método -viewDidLoad, como este:
Además, un archivo nib puede crear un botón y agregarlo a la vista del controlador de vista.
En iPhone OS 2.2, cuando se invocaba -didReceiveMemoryWarning desde el sistema, tenía que liberar algo para liberar memoria. Podría liberar la vista del controlador de vista completo si eso tuviera sentido. O simplemente contenidos que consumen mucha memoria.
Ahora, en el nuevo OS 3.0, hay un método -viewDidUnload, que se invocará desde el sistema cuando la vista se haya descargado debido a poca memoria (corríjame: ¿cuándo exactamente se llama a esto?)
-viewDidUnload se usa para liberar todos los objetos que eran propiedad tanto del controlador de vista como de la vista. La razón: si un controlador de vista contiene referencias a elementos secundarios de la vista, es decir, un botón, las vistas secundarias a las que se hace referencia no se liberarán, porque su recuento de retención es> = 1. Una vez que se publican en -viewDidUnload, pueden liberarse de memoria.
fuente
Apple desaprobó viewWillUnload, ahora debe usar didReceiveMemoryWarning o dealloc para liberar sus objetcs.
fuente
Si el controlador de vista se extrae de la pila de controladores de navegación y no se conserva en ningún otro lugar, se desasignará y se llamará a dealloc en lugar de viewDidUnload. Debería liberar las vistas creadas en loadView en dealloc, pero no es necesario establecer las variables en nil, porque poco después de llamar a dealloc, las variables dejarán de existir.
fuente
Puede liberar cualquier subvista que conserve, por ejemplo, ese UIImageView que retuvo en su método loadView, o mejor aún, la imagen que estaba en ese UIImageView.
fuente