es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

viewDidLoad, viewWillAppear llamados al forzar el cierre de la aplicación.

Tengo un problema con las funciones de ciclo de vida de mis aplicaciones viewDidLoad y viewWillAppear. Mi aplicación funciona bastante bien sin caídas hasta que la cierro forzosamente. Hice algo de depuración y parece que el problema es que, al cerrarla, los métodos viewDidLoad y viewWillAppear se llaman justo después de cerrar la aplicación.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    print("STARTSCREEN WILL APPEAR")

    UserDefaults.standard.set(90, forKey: "user_profile_current_xp")
    UserDefaults.standard.set(0, forKey: "user_profile_previous_level_xp")
    UserDefaults.standard.set(0, forKey: "user_profile_next_level_xp")
    UserDefaults.standard.set(0, forKey: "user_profile_player_level")

    updateLevelLabel()
    checkMenuItemLockStatus()
}

La aplicación se bloquea justo en las líneas de UserDefaults debido a una excepción EXC_BAD_ACCESS, lo cual tiene sentido porque la aplicación se está borrando de la memoria mientras intenta acceder/establecer valores.

Creo que el problema no ocurriría si viewDidLoad/Appear no se llamaran al cerrar la aplicación. Esto simplemente no tiene sentido para mí y no recuerdo haber tenido un problema similar con otras aplicaciones antes. ¿Me estoy perdiendo algo? ¿Qué podría desencadenar esos métodos al cerrar la aplicación?

Gracias de antemano.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Es el comportamiento esperado que los métodos viewDidLoad y viewWillAppear sean llamados cuando la aplicación se cierra forzadamente. Cuando una aplicación se cierra forzadamente, el sistema operativo termina su proceso inmediatamente y no le da la oportunidad de limpiar los recursos. Como resultado, cuando la aplicación se inicia de nuevo, necesita recrear su jerarquía de controladores de vista, lo cual implica llamar a los métodos viewDidLoad y viewWillAppear.

    Para evitar el fallo, puedes verificar si la aplicación está siendo lanzada por primera vez mediante la comprobación de si las claves de UserDefaults que necesitas establecer tienen valores antes de establecerlos. Alternativamente, puedes mover el código que establece los valores de UserDefaults a otro método que solo se llama durante el uso normal de la aplicación, como cuando el usuario completa un nivel o realiza alguna otra acción que justifique la actualización de los valores.

Comments are closed.