如何从Swift中的UIViewController卸载self.view

时间:2014-11-05 12:10:28

标签: ios swift uiviewcontroller

根据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中完成吗?

2 个答案:

答案 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中执行此操作。