根据View Controller Programming Guide,我们可以通过将self.view
分配给UIViewController
来明确地从nil
卸载self.view
。
但在Swift中,view
中的UIViewController
属性被声明为
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中完成吗?
答案 0 :(得分:4)
setValue(nil, forKey:"view")
似乎有效:
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
if self.view.window == nil {
self.setValue(nil, forKey: "view")
}
}
答案 1 :(得分:1)
您不再需要卸载视图。这就是为什么-[UIViewController viewDidUnload]
被弃用的原因。 documentation说:
在iOS 6.0中已弃用。在低内存条件下不再清除视图,因此永远不会调用此方法。
在 View Controller Programming Guide 中,它说:
视图用于在屏幕上绘制自身的内存可能非常大。但是,当视图未附加到窗口时,系统会自动释放这些昂贵的资源。大多数视图使用的剩余内存足够小,系统自动清除和重新创建视图层次结构是不值得的。
换句话说:如果视图层次结构附加到窗口,则可以消耗大量内存。但是如果视图层次结构没有附加到窗口,那么它很便宜。
所以答案是:不要试图卸载你的观点。无论如何,它不会给你很多记忆。当然,如果您可以释放任何可以恢复/重新计算的对象(如缓存),请在didReceiveMemoryWarning
中执行此操作。