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



根据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中执行。

最新更新