【问题标题】:How to unload self.view from UIViewController in Swift如何在 Swift 中从 UIViewController 卸载 self.view
【发布时间】:2014-11-05 12:10:28
【问题描述】:

根据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 中还有其他方法吗?

【问题讨论】:

  • self.view.removeFromSuperview()
  • @ArturKucaj:……完全不同。

标签: ios swift uiviewcontroller


【解决方案1】:

setValue(nil, forKey:"view") 似乎有效:

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    if self.view.window == nil {
        self.setValue(nil, forKey: "view")
    }
}

【讨论】:

  • view 属性不允许设置 nil 可能是经过审核的 Swift API 中的一个错误。 (根据 Apple 开发者论坛上的建议,您应该 file a bug 在标题中使用#IUO。)不过,这是一个很好的解决方法。
【解决方案2】:

您不再需要卸载视图。这就是不推荐使用-[UIViewController viewDidUnload] 的原因。 documentation 说:

在 iOS 6.0 中已弃用。在内存不足的情况下不再清除视图,因此永远不会调用此方法。

View Controller Programming Guide中,它说:

视图在屏幕上绘制自身所使用的内存可能非常大。但是,当视图未附加到窗口时,系统会自动释放这些昂贵的资源。大多数视图使用的剩余内存足够小,以至于系统不值得自动清除和重新创建视图层次结构。

换句话说:如果视图层次结构附加到一个窗口,它消耗大量内存。但是,如果视图层次结构没有附加到窗口,那就很便宜了。

所以答案是:不要试图卸载你的视图。无论如何,它不会给你太多的记忆。当然,如果您可以释放任何可以恢复/重新计算的对象(如缓存),请在didReceiveMemoryWarning 中这样做。

【讨论】:

  • 我明白为什么不再自动发布视图。但是,我想将所有资源的初始化过程集中在viewDidLoad。所以当我发布一些东西时,我也想发布view
  • 即使视图是自动释放的,并且视图层次结构本身并不维护昂贵的资源,但将视图控制器的主视图归零仍然很有价值:许多 VC 将状态设置集中在 viewDidLoad .这可能包括重量级的非视图层次状态数据,并且视图层次结构中的任何自定义视图也可能引用非视图数据。从轨道上对它进行核对是一种确保 a) 全部消失并且 b) 一旦再次需要它,它就会在与正常初始化相同的代码路径上重新初始化的一种方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
相关资源
最近更新 更多