tengo para otros nada lleno limpiar liberar espacio como cache borrar basura archivos app aplicaciones apartado almacenamiento ios objective-c memory-management uiviewcontroller automatic-ref-counting

ios - para - Cuando se descarta un controlador de vista, ¿debería vaciar la memoria?



como limpiar mi iphone de archivos basura (2)

El controlador de vista debe eliminarse de la memoria cuando otros objetos no lo utilizan (o no tiene conexiones fuertes con otros objetos que aún no se han eliminado de la memoria).

Ex.

class ViewController: UIViewController { var secondViewController: SecondViewController? override func viewDidLoad() { super.viewDidLoad() } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if let identifier = segue.identifier { if identifier == "second" { if secondViewController == nil { secondViewController = segue.destinationViewController as? SecondViewController } else { println("There''s still an instance of second view controller") } } } } }

Supongamos que ha presentado el segundo ViewController por primera vez con el guión gráfico del guión gráfico y lo almacena en su instancia de ViewController como una propiedad. Luego, descarta el segundo ViewController, y presenta nuevamente el segundo ViewController desde ViewController, se imprimirá "Todavía hay una instancia de segundo controlador de vista" ya que el ViewController todavía estaba usando el que presentó anteriormente.

Sin embargo, cuando secondViewController tiene una conexión débil, ( weak var secondViewController: SecondViewController ), nunca se imprimirá, ya que desde el momento en que se descartó el segundo ViewController, se eliminará de la memoria y el segundo ViewController será nulo.

EDITAR :

Nota: El resultado debe ser el mismo cuando se usa Objective-C.

Me gustaría aprender sobre la gestión de la memoria en Objective-C, lo que no me resulta fácil porque soy bastante nuevo en Objective-C y ARC, y en general me utilizan para escribir lenguajes para los que no tengo que lidiar con eso. mucho (o nada) con la gestión de la memoria.

La aplicación en la que estoy trabajando presenta un viewController (con el archivo xib adjunto) del código después de presionar un botón. En este controlador de vista, tengo varias vistas instanciadas; Grabo una secuencia de imágenes (fotos de la cámara, guardadas en el disco) que convierto en una película y tengo un rastreador gps (mapKit) que muestra un pequeño mapa en la pantalla. Después de que todo está hecho, puedo presionar un botón ''hecho'' que llama [self dismissViewControllerAnimated:YES completion:nil];

El viewController está animado de nuevo en mi rootViewController y como puse un mensaje NSLog dentro del método dealloc en viewController que está siendo descartado, puedo confirmar que viewController está siendo desasignado.

El problema es que veo que la memoria aumenta después del uso de la aplicación (el uso consiste en tomar imágenes y grabar ubicaciones gps en un mapa MapKit, así como generar un archivo de película) a unos 80 MB y esto cae a unos 70 MB cuando presiono ''hecho'' para que viewController lo rechace y la aplicación regrese a mi rootViewController. Puedo presentar el mismo viewController de nuevo, usarlo y descartarlo, y la aplicación aún ocupará alrededor de 70 MB de memoria que no se cae. Esto en realidad no parece una pérdida de memoria porque en ese caso esperaría un aumento constante de la memoria con cada instanciación y descarte de viewController. Este no es el caso, incluso si tengo diferentes botones en mi rootViewController que crean una instancia nueva y única de mi clase viewController.

Me pregunto: ¿hay algo que debería buscar o es este comportamiento esperado? Tal vez la aplicación está almacenando en caché las clases para uso futuro? Con la administración de memoria correcta, ¿debería esperar que una aplicación vuelva al estado de memoria "virgen" (en este caso sería de alrededor de 4 MB) después de descartar el único control de vista que se presentó?


Si está viendo que esta memoria aumenta en Xcode y no cuando usa instrumentos, la respuesta que he encontrado se encuentra en esta respuesta.

Puedes leer toda la respuesta, es bastante profunda. Pero para abreviar, en Xcode está viendo la cantidad de memoria que el sistema operativo le ha "dado" a su aplicación para usar. Esto aumentará cada vez que su aplicación intente asignar algo. No disminuye tan rápido porque el sistema operativo realiza suposiciones de rendimiento pensando que su aplicación puede necesitar más memoria en el futuro. Es más rápido para el sistema operativo dejar esa memoria "dada" a su aplicación en lugar de quitársela y devolverla más tarde.