当视图控制器被解散时,是否应清空内存?

我想了解Objective-C中的内存pipe理,我觉得这不是那么容易,因为我在Objective-C和ARC方面相当新颖,而且我大多用来编写我不需要处理的语言内存pipe理很多(或根本不)。

我正在处理的应用程序是按下button后,代码呈现viewController(附带xib文件)。 在这个视图控制器中,我有几个实例化的视图; 我logging了一系列图像(照片的相机,保存到磁盘),我转换成电影,我有一个GPS屏幕上的一个小地图的GPS跟踪器(mapKit)。 毕竟,我可以推一个“完成”button,调用[self dismissViewControllerAnimated:YES completion:nil];

viewController被animation回到我的rootViewController,因为我把一个NSLog消息放在viewController中的dealloc方法里,这个方法被解散了,我可以确认这个viewController被释放了。

问题是,我看到使用该应用程序后的记忆上升(用法包括在MapKit地图上拍摄照片和loggingGPS位置,以及生成一个电影文件)约80 MB,当我按下时,这将下降到约70MB '完成',所以viewController解散,应用程序返回到我的rootViewController。 我可以再次展示相同的viewController,使用它并closures它,应用程序仍然会占用大约70MB的内存,不会掉落。 这看起来不像是一个内存泄漏,因为在那种情况下,我希望每一个实例化和解除viewController的内存稳步增长。 即使我在我的rootViewController中有不同的button,但并不是这种情况,它们都实例化了我的viewController类的一个新的唯一实例。

我想知道:有什么我应该找的或是这种预期的行为? 也许应用程序caching类以备将来使用? 随着内存pipe理的完成,我应该期待一个应用程序恢复到“处女”的内存状态(在这种情况下,这将是4 MB左右)解除唯一的viewController提交?

如果你在Xcode中看到这个记忆上升,而不是在使用仪器的时候,那么我提出的答案就是在这个答案中。

你可以阅读整个答案,这是相当深入的。 但是长话短说,在Xcode中,您正在看到操作系统“给”应用程序使用的内存量。 这会增加任何时候你的应用程序尝试分配的东西。 它不会像以前那样快速下降,因为操作系统的性能猜测认为您的应用程序将来可能需要更多内存。 操作系统离开“给予”你的应用程序的内存比把它拿走并稍后再回来的速度要快。

当视图控制器没有被其他对象使用时,它应该从内存中清除出去(或者没有与其他对象没有强连接的内存)。

防爆。

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

假设您第一次使用storyboard segue展示了第二个ViewController,并将其作为属性存储在您的ViewController实例中。 然后,你closures第二个ViewController,并从ViewController再次呈现第二个ViewController,它将打印出“还有一个第二个视图控制器的实例”,因为你之前介绍的那个仍然被ViewController使用。

但是,当secondViewController有一个弱连接( weak var secondViewController: SecondViewController )时,它永远不会打印,因为从secondViewController被解散的那一刻起,它将被从内存中移除,并且secondViewController将为零。

编辑

注意:使用Objective-C时结果应该是相同的。