tiene que precio descargar caracteristicas ios6

ios6 - que - ios 8



iOS6 viewDidUnload Obsoleto (4)

Tal vez esta es una mala práctica, pero a partir de la documentación que leí recibí el consejo de inicializar objetos en algunos casos dentro del método viewDidLoad y nada en viewDidUnload.

Por ejemplo, si tiene algo así como agregar un Observer

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(filterready:) name:@"filterReady" object:nil];

Ahora no tengo un método para eliminar el Observer, sin embargo se llama a viewDidLoad cada vez que se muestra la vista, lo que hace que varios observadores se ejecuten después de un tiempo y el selector se llama varias veces.

Puedo solucionar esto moviendo algunos limpiadores al método viewDidDisappear, pero ahora tengo algunas dudas si estoy haciendo lo correcto.

En mi ejemplo, tengo múltiples Controladores de navegación que controlan sus subnavegaciones, pero nunca se llama a dealloc, a pesar de que no están referenciados


¿Por qué no simplemente eliminar al observador en la función DEALLOC? Y si está usando ARC, no llame [super dealloc]

Si ve que la función dealloc del controlador no se está llamando, entonces debe descubrir por qué ocurre esto. Tal vez tenga un NSTimer ejecutándose en ViewController y cuando muestre la vista, esto haría que dealloc no sea llamado. O la vista se conserva en otro lugar.


Antes que nada, incluso cuando viewDidUnload no haya sido desaprobado, debe haber viewDidUnload registro de esa notificación en viewDidUnload AND dealloc . Incluso antes de iOS 6, viewDidUnload NO se llama en la mayoría de las circunstancias; solo en situaciones de poca memoria. Entonces, si solo lo hubiera puesto en viewDidUnload y no dealloc anteriormente, no se habría desregistrado, y probablemente se habría bloqueado cuando se desasignó y recibió una notificación. Así que debe haber tenido que ponerlo en dealloc antes, para que haya funcionado correctamente.

En segundo lugar, si lo hizo correctamente antes, no necesita hacer nada adicional para que funcione correctamente en iOS 6. La única diferencia en iOS 6 es que las vistas ya no se descargan (incluso en situaciones de poca memoria). Por lo tanto, es lo mismo que en iOS 5 cuando no se encontraba en una situación de poca memoria. Como las vistas no están descargadas, viewDidLoad solo se llamará una vez, por lo que su notificación solo se registrará una vez. No se registrará en dealloc , ya que debe haberlo dealloc para que haya funcionado correctamente.


Debe usar los métodos - (void)didReceiveMemoryWarning y - (void)dealloc .

En iOS 6, los métodos viewWillUnload y viewDidUnload de UIViewController ahora están en desuso. Si usaba estos métodos para liberar datos, use el método didReceiveMemoryWarning. También puede usar este método para liberar referencias a la vista del controlador de vista si no se está utilizando. Debería probar que la vista no está en una ventana antes de hacer esto.

Por lo tanto, debe verificar si su vista está primero en la ventana y luego eliminar su observador en la didReceiveMemoryWarning


La respuesta de Alex es buena. Pero me gusta el emparejamiento adecuado. Por esa razón, a menos que la vista deba ser notificada cuando aún no se ve, generalmente agrego una notificación en viewWillAppear y viewDidDisappear