根据View Controller Programming Guide,我们可以通过将nil
分配给self.view
来从UIViewController
显式卸载self.view
。
但在Swift中,UIViewController
中的view
属性被声明为
var view: UIView
它不是UIView!
,因此以下代码不编译
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
if self.view.window == nil {
self.view = nil
// ^ Type 'UIView' does not conform to protocol 'NilLiteralConvertible'
}
}
在Swift中还有其他方法吗?
setValue(nil, forKey:"view")
似乎有效:
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
if self.view.window == nil {
self.setValue(nil, forKey: "view")
}
}
您不再需要卸载视图。这就是-[UIViewController viewDidUnload]
被弃用的原因。文件上写着:
在iOS 6.0中已弃用。视图在内存不足的情况下不再被清除,因此永远不会调用此方法。
在查看控制器编程指南中,它说:
视图用于在屏幕上绘制自己的内存可能相当大。但是,当视图未附着到窗口时,系统会自动释放这些昂贵的资源。大多数视图使用的剩余内存足够小,系统不值得自动清除并重新创建视图层次结构。
换句话说:如果视图层次结构附加到窗口,则会消耗大量内存。但是,如果视图层次结构没有附加到窗口,那就相当便宜了。
所以答案是:不要试图卸下你的观点。无论如何,它不会给你太多的记忆。当然,如果您可以释放任何可以恢复/重新计算的对象(如缓存),请在didReceiveMemoryWarning
中执行。