12

Esperaría que después de presionar un controlador de vista, tenga que liberar mi propiedad del controlador de vista como lo hice a continuación.UINavigationController: ¿Cuándo recibe una vista presionada el mensaje Dealloc?

CustomViewController *nextViewController = [[CustomViewController alloc] initWithNibName:@"CustomView" bundle:nil]; 
[[self navigationController] pushViewController:nextViewController animated:YES]; 
[nextViewController release]; 

Después de hacer eso, asumir que el controlador de navegación tiene la propiedad de ese objeto y lo dará a conocer cuando se hace que luego llamar dealloc en mi customViewController. Esperaría que sucediera cuando toco el botón Atrás en la barra de navegación y la vista ya no se muestra. Eso no sucede sin embargo. Agregué un NSLog (@ "CustomViewController recibió dealloc") en el método dealloc de CustomViewController pero nunca se imprime. ¿Es este comportamiento normal?

¿El controlador de navegación está haciendo algo así como mantener ese objeto en caso de que lo necesite en algún momento? ¿Se deshace cuando la memoria comienza a agotarse? Traté de simular una advertencia de memoria baja, pero no pasa nada. Tengo la sensación de que la respuesta a esta pregunta será que no debería preocuparme demasiado y seguir el procedimiento estándar para retener/liberar/liberar automáticamente. Sin embargo, dicho esto, ¿alguien más ahondó en esto un poco más y descubrió una respuesta absoluta?

Respuesta

13

"¿El controlador de navegación hace algo así como mantener ese objeto en caso de que lo necesite en algún momento?"

Sí. Eso es exactamente lo que está haciendo. Sin embargo, le enviará viewDidLoad y viewDidUnload mensajes. Y ese es el lugar donde debe asignar y liberar los recursos que su viewcontroller usa.

Tenga en cuenta que viewDidUnload solo se ejecutará cuando el sistema crea que necesita liberar memoria.

Si necesita un control más inmediato sobre cuándo se cargan y liberan las cosas, un mejor lugar podría ser viewWillAppear: y viewDidDisappear:.

Mis métodos alloc/init para viewcontrollers suelen estar bastante vacíos o incluso no están allí.

+2

De acuerdo con la documentación, viewDidUnload solo se envía en los casos en que su dispositivo haya ingresado en condiciones de poca memoria. No hay indicaciones de que viewDidUnload esté involucrado con la desasignación. – Giao

+0

Tienes razón, por supuesto. Actualizado mi respuesta :-) –

+0

Eso trae más? 1) ¿Cuál es el método dealloc dentro de mi viewconroller? 2) ¿El controlador de navegación está esperando hasta que reciba algún tipo de señal para finalmente deshacerse de los viejos controladores de visualización? 3) Si la respuesta es sí a # 2, ¿qué señal? Puse un mensaje de nslog en mi método de advertencia de recuperación de memoria en mi clase de controlador de vista y después de presionar y abrir varias veces, simulando una advertencia de memoria, recibo N mensajes en la consola. Eso me dice que todos los objetos todavía están allí y que la advertencia de memoria no provocó que se desasignaran porque el mensaje de registro en el mensaje dealloc no se imprime. – startoftext

Cuestiones relacionadas