Cuando se desecha un controller de vista, ¿debería vaciar la memory?

Me gustaría aprender sobre la gestión de la memory en Objective-C, que no encuentro tan fácil porque soy bastante nuevo en Objective-C y ARC, y estoy acostumbrado a escribir lenguajes para los que no tengo que lidiar con eso Mucho (o nada) con administración de memory.

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

El viewController está animado de nuevo a mi rootViewController y porque puse un post NSLog dentro del método dealloc en el viewController que se está descartando Puedo confirmar que este viewController se está desasignando.

El problema es que veo el aumento de la memory después del uso de la aplicación (el uso consiste en tomar fotos y grabar ubicaciones GPS en un map de MapKit, así como generar un file de película) a aproximadamente 80 MB y esto disminuye a aproximadamente 70 MB cuando presiono 'hecho', por lo que el viewController descarta y la aplicación vuelve a mi rootViewController. Puedo presentar nuevamente el mismo viewController, usarlo y descartarlo, y la aplicación seguirá ocupando alnetworkingedor de 70 MB de memory que no se caen. En realidad, esto no parece ser una pérdida de memory para mí, porque en ese caso, esperaría un aumento constante de la memory con cada instanciación y rechazo del viewController. Este no es el caso, incluso si tengo botones diferentes en mi rootViewController que instancen una instancia nueva y única de mi class viewController.

Me pregunto: ¿Hay algo que debería search o es este comportamiento esperado? ¿Tal vez la aplicación está almacenando classs en caching para uso futuro? Con la gestión de la memory hecha a la perfección, ¿debería esperar que una aplicación vuelva al estado de memory 'virgen' (en este caso, esto sería alnetworkingedor de 4 MB) después de eliminar el único viewController que se presentó?

Si ve que esta memory aumenta en Xcode y no cuando usa instrumentos, la respuesta que he encontrado está en esta respuesta.

Puedes leer esa respuesta completa, es bastante profunda. Pero una larga historia corta, en Xcode está viendo la cantidad de memory que el sistema operativo le ha "dado" a su aplicación para usar. Esto boostá cada vez que su aplicación intente asignar algo. No disminuye tan rápido porque el sistema operativo adivina el performance pensando que su aplicación puede necesitar más memory en el futuro. Es más rápido para el sistema operativo dejar esa memory "dada" a su aplicación que quitársela y devolverla más tarde.

El controller de vista debe borrarse de la memory cuando otros objects no lo utilizan (o no tienen conexiones sólidas con otros objects que aún no se hayan eliminado de la memory).

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") } } } } } 

Digamos que presentó el segundo ViewController la primera vez que utilizó el storyboard segue, y lo almacena en su instancia de ViewController como una propiedad. Luego, descarta el segundo ViewController, y vuelve a presentar el segundo ViewController desde ViewController, se imprimirá "There's still a instance of second view controller", ya que el ViewController todavía usaba el que presentaba anteriormente.

Sin embargo, cuando secondViewController tiene una connection débil, ( weak var secondViewController: SecondViewController ), nunca se imprimirá, ya que desde el momento en que se desestimó el segundoViewController, se eliminará de la memory y el segundoViewController será nulo.

EDITAR :

Nota: El resultado debe ser el mismo al usar Objective-C.