今天发现 APP 中有几个包含手写控件的 ViewController 不会自动释放内存,即不会主动调用 deinit。通过在 ViewDidDisappear 中 添加 self.view = nil 可以触发调用 deinit 。但是无法区分是结束 ViewController 或者是进入后台。在 OC 时代可以使用下面代码来判断是否已经关闭视图。
if (![[self.navigationController viewControllers] containsObject: self])
{
// the view has been removed from the navigation stack, back is probably the cause
// this will be slow with a large stack however.
}
在 Swift 中不能用 containsObject 了,最后发现直接判断 self.navigationController 即可达到同样的目的。
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
if let nc = self.navigationController{
// 在后台
}else{
// 已关闭
// 触发 deinit
self.view = nil
}
}
参考:http://blog.csdn.net/xiaochong2154/article/details/45603511