16

Soy el nuevo desarrollador a punto de lanzar mi primera aplicación. Estoy confundido acerca de la desaprobación de viewDidUnload como se describe a continuación en notas de la versión iOS 6 de Apple:iOS 6 desaprobación de viewWillUnload & move a didReceiveMemoryWarning

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

¿Por qué sucede esto? ¿Qué directrices debo seguir para garantizar que este cambio no cause problemas de rendimiento en mi aplicación?

Gracias.

+0

Lo que está utilizando actualmente para viewDidUnload en su aplicación? –

Respuesta

17

De acuerdo con Apple, han mejorado la administración de la memoria interna para tener las mismas vistas que las ganancias logradas al destruir cosas en viewWill/DidUnload son mínimas. Además, tienen datos que sugieren que muchas aplicaciones fallan porque las aplicaciones no manejan adecuadamente esas notificaciones, y hacen "otras" cosas no asociadas con la descarga de la vista.

Finalmente, una advertencia de memoria ahora se verifica como la primera y única advertencia que recibirá antes de que su aplicación finalice debido a la poca memoria, por lo que es realmente el lugar adecuado para manejar problemas de memoria.

Así que, básicamente, simplemente elimine sus métodos viewWillUnload y viewDidUnload. Maneje problemas de memoria en didReceiveMemoryWarning y cualquier otra administración de controlador de vista en los lugares apropiados.

EDITAR

¿Puedo preguntar: ¿cuáles son esos "lugares apropiados"? Solía ​​usar ViewdidUnload en ciertas situaciones donde la vista [Will/Did] desapareció era no del todo adecuada. Como ir más abajo en la pila de controladores de navegación . ¿Te importaría profundizar en eso? - Dan1one

Eso depende. Sé que eso no es lo que quieres escuchar, pero es la verdad :-)

En general, debes evitar la asimetría. Por lo tanto, debe "deshacer" una operación utilizando el método simétrico del que "hizo" el original. En general, debería poder hacer todo el trabajo de tipo viewDidUnload en didReceiveMemoryWarning y dealloc.

Esto realmente no debería causar un cambio, porque tenía que duplicar la mayor parte de ese código en ambos lugares de todos modos.

No sé a qué te refieres con "ir más abajo en la pila del controlador de navegación", por lo que tendrás que aclarar ese ejemplo para que yo proporcione una respuesta útil.

Uno de los problemas con el uso de viewDidDisappear y viewDidAppear fue que era difícil saber cuándo aparecía la vista porque en realidad estaba apareciendo, o porque una vista que estaba encima desaparecía ... haciendo que apareciera .Se supone

Estas piezas de API para ayudarle a resolver esos problemas:

- (BOOL)isMovingFromParentViewController 
- (BOOL)isMovingToParentViewController 
- (BOOL)isBeingDismissed 
- (BOOL)isBeingPresented 
+0

¿Puedo preguntar: ¿cuáles son esos "lugares apropiados"? Solía ​​usar ViewdidUnload en ciertas situaciones en las que la vista [Will/Did] desaparecía no era del todo adecuada. Como ir más abajo en la pila del controlador de navegación. ¿Te importaría profundizar en eso? – Dan1one

+0

@ Dan1one: umm ... 'viewDidUnload' NO se llama cuando se quita de la pila, o en la mayoría de las demás circunstancias. Entonces no tengo idea de lo que estaba haciendo – user102008

+0

La mejor respuesta que vi durante meses. ¡Gracias! –

8

En iOS 6, puntos de vista no se descargan.

Esto significa que loadView y viewDidLoad solo se llaman una vez, y viewDidUnload nunca se llama. Entonces, si su controlador de vista usa viewDidUnload para manejar condiciones de poca memoria, entonces tendrá que cambiar.

Si desea responder a las condiciones de poca memoria, implemente didReceiveMemoryWarning y libere sus datos y objetos temporales con este método.

6

En iOS 6 que debemos liberar vistas por nosotros mismos, hacer algo como esto

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 

    if([self isViewLoaded] && self.view.window == nil) 
    { 
     self.view = nil; 
    } 
} 
Cuestiones relacionadas