ios swift didreceivememorywarning

ios - ¿Cómo implementar didReceiveMemoryWarning en Swift?



(2)

Cada vez que creo una nueva subclase de View Controller, Xcode agrega automáticamente el método

override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated }

Normalmente lo borro o lo ignoro. Esto es lo que hacen todos los tutoriales que he visto, también. Pero asumo que ya que Xcode me lo da cada vez, debería ser algo importante, ¿verdad? ¿Qué debería estar haciendo aquí? Supongo que disponer de recursos significa establecerlos en cero, pero ¿qué son exactamente los "recursos que se pueden recrear"?

He visto estas preguntas:

Pero todos ellos son pre-Swift. Aunque no sé mucho sobre Objective-C, he oído que la administración de la memoria es diferente. ¿Cómo afecta eso lo que debería hacer en didReceiveMemoryWarning ?

Otras notas:

  • Soy fuzzmente consciente del recuento automático de referencias y la ejemplificación perezosa
  • La documentation sobre didReceiveMemoryWarning que encontré fue bastante breve.

Rápido

Swift usa ARC como lo hace Objective-C ( fuente de Apple Docs ). El mismo tipo de reglas se aplica para liberar memoria, eliminar todas las referencias a un objeto y se desasignará.

Cómo liberar la memoria

Supongo que disponer de recursos significa establecerlos en cero, pero ¿qué son exactamente los "recursos que se pueden recrear"?

Los "recursos que pueden recrearse" realmente dependen de su aplicación.

Ejemplos

Digamos que eres una aplicación de redes sociales que trata muchas imágenes. Desea una interfaz de usuario ágil, de modo que almacene en memoria caché las siguientes 20 imágenes para que el desplazamiento sea más rápido. Esas imágenes siempre se guardan en el sistema de archivos local.

  • Las imágenes pueden ocupar mucha memoria.
  • No necesitas esas imágenes en la memoria. Si la aplicación tiene poca memoria, tomar un segundo extra para cargar la imagen de un archivo está bien.
  • Podría volcar completamente el caché de imágenes cuando reciba la advertencia de memoria.
  • Esto liberará la memoria que el sistema necesita.

Estás creando un juego increíble que tiene varios niveles diferentes. Cargar un nivel en tu motor de juego de fantasía lleva un tiempo, por lo que si el usuario tiene suficiente memoria, puedes cargar el nivel 3 mientras juegan el nivel 2.

  • Los niveles ocupan mucha memoria.
  • No necesitas el siguiente nivel en la memoria. Son agradables de tener pero no esenciales.
  • LevelCache.sharedCache().nextLevel = nil libera toda esa memoria

¿Qué no deberías desasignar?

Nunca desasigne las cosas que están en pantalla. He visto algunas respuestas a preguntas relacionadas que anulan la vista del UIViewController. Si eliminas todo de la pantalla, es posible que se bloquee (en mi opinión).

Ejemplos

Si el usuario tiene un documento abierto que está editando, NO lo desasigne. Los usuarios se enojarán excepcionalmente con usted si su aplicación elimina su trabajo sin haber sido salvados. (De hecho, probablemente debería tener algún mecanismo de guardado de emergencia para cuando eso ocurra)

Si su usuario está escribiendo una publicación para su fabulosa aplicación de redes sociales, no deje que su trabajo se desperdicie. Guárdalo e intenta restaurarlo cuando vuelvan a abrir la aplicación. Aunque es mucho trabajo configurar, me encantan las aplicaciones que hacen esto.

Nota

La mayoría de los dispositivos modernos rara vez se quedan sin memoria. El sistema hace un buen trabajo de eliminar aplicaciones en segundo plano para liberar memoria para la aplicación que se ejecuta en primer plano. Probablemente haya visto una aplicación "abierta" en el Cambiador de aplicaciones, pero al tocar la aplicación se abrió a su estado inicial. El sistema operativo eliminó la aplicación en segundo plano para liberar memoria. Consulte Restauración estatal para obtener información sobre cómo evitar este problema.

Si su aplicación está recibiendo advertencias de memoria consistentes cuando no está realizando una gran cantidad de procesamiento, asegúrese de no perder primero la memoria. Detectar pérdidas de memoria está fuera del alcance de esta respuesta. Docs y un tutorial .


Cuando se llama didReceiveMemoryWarning , significa que su aplicación está usando demasiada memoria (compárela con la memoria del dispositivo), y debe release any additional memory used by your view controller para reducir la memoria de su aplicación. Si la aplicación de memoria supera la memoria del dispositivo, iOS eliminará tu aplicación de inmediato. "recursos que pueden recrearse" significa que puede volver a crearlos en otro lugar, no los necesita ahora (no es necesario que los guarde en la memoria). Y puedes liberarlo cuando consigas didReceiveMemoryWarning .

Aquí hay otro tema de detalle: ios presupuesto de memoria máximo de la aplicación