¿Cuándo debo liberar objects en – (void) viewDidUnload en lugar de en -dealloc?

¿Cuál es el -(void)viewDidUnload es bueno para?

¿No podría simplemente relaver todo en -dealloc ? Si la vista se downloada, ¿no se -dealloc forma -dealloc ?

Además de lo que ya se ha indicado, quise elaborar más información sobre la lógica behind -viewDidUnload .

Una de las razones más importantes para implementarlo es que UIViewController subclasss UIViewController comúnmente también contienen references propias a varias subvistas en la jerarquía de vistas. Estas properties podrían haberse establecido a través de IBOutlets al cargar desde una punta, o por progtwig dentro de -loadView , por ejemplo.

La propiedad adicional de las subvenciones por UIViewController significa que incluso cuando su vista se elimina de la jerarquía de vistas y se libera para save memory, a través de la cual la vista también libera las subvistas, en realidad no se desasignarán porque el UIViewController todavía contiene su Posee excelentes references de retención a esos objects también. La liberación de la propiedad adicional de UIViewController de estos objects garantiza que también se desasignarán a la memory libre.

Los objects que se lanzan aquí generalmente se vuelven a crear y se configuran de nuevo cuando se re-loaded la vista UIViewController , ya sea desde una Nib oa través de una implementación de -loadView .

Tenga en count también que la propiedad de view UIViewController es nil al momento de llamar a este método.

Como dice la documentation :

Se llama durante condiciones de baja memory cuando el controller de vista necesita liberar su vista y cualquier object asociado con esa vista para liberar memory.

En la misma situación no se llama a dealloc . 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 : Cabe señalar que viewDidUnload estaba en desuso en iOS 6 porque "Las vistas ya no se purgan en condiciones de baja memory y por lo tanto, este método nunca se llama". Entonces, el consejo moderno no es preocuparse por él y usar dealloc .

Esto se debe a que típicamente establecerá @property como "(nonatomic, retain)" y, como tal, el setter que se crea para usted libera el object actual y luego conserva el argumento, es decir

 self.property = nil; 

… hace algo parecido a:

 [property release]; property = [nil retain]; 

Por lo tanto, estás matando a dos pájaros de un tiro: gestión de memory (liberando el object existente) y asignando el puntero a cero (ya que enviar cualquier post a un puntero nulo devolverá cero).

Espero que ayude.

Recuerde que viewDidUnload es un método en el controller de vista, no en la vista. El método dealloc la vista se llamará cuando se descargue la vista, pero el método dealloc del controller de dealloc no se llamará hasta más tarde.

Si recibe una advertencia de poca memory y su vista no se muestra, lo que sucederá, por ejemplo, en cualquier momento en que use un UIImagePickerController para permitir que el usuario tome una fotografía, su vista se downloadá y tendrá que volver a cargarse después de eso.

Conclusión:

Los controlleres de vista tienen una propiedad de vista. Normalmente, una punta o pieza de código agrega otras vistas a esta vista. Esto sucede a menudo dentro de un método -viewDidLoad, así:

 - (void)viewDidLoad { [super viewDidLoad]; [self createManyViewsAndAddThemToSelfDotView]; } 

Además, un file de nib puede crear un button y agregarlo a la vista del controller de vista.

En iPhone OS 2.2, cuando se invocaba -didReceiveMemoryWarning desde el sistema, tenía que liberar algo para liberar memory. Podría liberar toda la vista del controller de vista si eso tuviera sentido. O simplemente grandes contenidos que consumen mucha memory.

 - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview // Release anything that's not essential, such as cached data } 

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 la falta de memory (por favor, corrígeme: ¿cuándo se llama exactamente?)

-viewDidUnload se usa para liberar todos los objects que eran propiedad tanto del controller de vista como de la vista. El motivo: si un controller de vista contiene references a elementos secundarios de la vista, es decir, un button, las vistas secundarias referencedas no se publicarán, porque su recuento de retención es> = 1. Después de que se publican en -viewDidUnload, pueden liberarse de memory.

Apple desaprobó viewWillUnload, ahora deberías usar didReceiveMemoryWarning o dealloc para lanzar tus objectives.

En iOS 6, los methods viewWillUnload y viewDidUnload de UIViewController ahora están en desuso. Si estaba utilizando estos methods para liberar datos, use el método didReceiveMemoryWarning en su lugar. También puede usar este método para liberar references a la vista del controller de vista si no se está utilizando. Tendría que probar que la vista no está en una window antes de hacer esto.

Si el controller de vista se extrae de la stack del controller de navigation y no se retiene en ningún otro lado, se desasignará y se llamará a dealloc en lugar de a 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 que se llame a dealloc, las variables dejarán de existir.

Puede liberar cualquier subvención a la que se aferre, por ejemplo, esa UIImageView que retuvo en su método loadView, o mejor aún la image que estaba en esa UIImageView.