2009-02-23 15 views
24

Estoy usando UINavigationController para moverme entre las vistas. Cuando avanzo y retrocedo en las vistas, la memoria utilizada por mi aplicación sigue aumentando. Al colocar declaraciones NSLog en el método dealloc de todos los controladores de vista, noté que solo se llamaba a algunos controladores de visualización y no a todos los que se mostraban.iPhone - ¿cuándo se llama a un control de vista?

Por ejemplo, esta es la secuencia en la que son empujados vistas MainViewController -> viewcontroller1 -> viewcontroller2 -> viewcontroller3

Ahora en viewcontroller3 si hago un popToViewController: mainController, dealloc sólo se llama para viewcontroller3. No se llama para viewcontroller1 y 2.

¿Puede alguien decirme por qué sucede esto?

Ha encontrado el problema. El método dealloc no se llamaba si alguna de las referencias mantenidas por un controlador de vista todavía estaban en la memoria. En mi caso, fue el objeto MPMoviePlayerController el que no se lanzó en viewcontroller1 y viewcontroller2.

+0

Me encontré exactamente con el mismo problema; se llama a dealloc solo para el 3er controlador. Usted dijo "El método dealloc no se llamaba si alguna de las referencias mantenidas por un controlador de vista todavía estaban en la memoria". ¿Puedes dar más detalles sobre esto? –

+1

El viewcontroller era un delegado de un objeto que aún se está utilizando. Lo eliminé de ser el delegado y luego funcionó bien. No estaba desasignado ya que el otro objeto tenía su referencia (como delegado) – lostInTransit

Respuesta

13

Es un caso de último encendido, primero apagado. Entonces, si imagina que su primer controlador de visualización es el bollo inferior de una hamburguesa, agregue la hamburguesa (segundo controlador de vista) y luego la hamburguesa superior (tercer controlador de vista).

Si vuelve a la hamburguesa, saca el bollo superior (popViewController: llama al método dealloc de la vista que se muestra). Si desea volver al bollo inferior, debe hacer estallar la hamburguesa (se llama a dealloc cada vez que se abre la vista).

no

seguro de por qué en el pop de raíz dealloc el segundo controlador de vista de que no se llamaría aunque ..

hmm

+0

Gracias Dan. Eso es lo que me sorprende que se llame dealloc para algunas clases y no para otras. ¿Conoces alguna situación cuando esto podría pasar? – lostInTransit

+0

Estoy enfrentando el mismo problema, también tengo dos controladores de visualización y el segundo dealcontrol de control de vistas no se llama cuando se desconecta de la pila de navegación. – Heena

0

donde navegar sus controladores no debería haber necesidad de escribir esta línea después de pushviewcontroller, [viewControllername versión]; entonces sería llamar a cada viewcontroller Método Dealloc :)

+0

Esta no es la respuesta real a la pregunta formulada, más un "punto para recordar" para los nuevos desarrolladores ObjC. – Sushant

0

También debe tener en cuenta que dealloc no siempre se garantiza que se ejecute.

+1

Eso es incorrecto. Dealloc se ejecutará cuando se haya lanzado la última referencia a un objeto. – Jason

+6

Bueno, esto no es completamente incorrecto, esto es cierto si la aplicación está saliendo de acuerdo con la Guía de programación de administración de memoria para Cocoa. –

-1

usa como [self.navigationController popToRootViewControllerAnimated: YES]; Funcionó para mí ... llama a todos los metlo dealloc de mis 10 controladores de vista

Cuestiones relacionadas