如何从UIViewController的斯威夫特
卸载self.view据View Controller Programming Guide,我们可以明确地分配到nil
卸载self.view
从UIViewController
self.view
。如何从UIViewController的斯威夫特
但是在斯威夫特,在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'
}
}
是否有另一种方式做到这一点的斯威夫特?
setValue(nil, forKey:"view")
似乎工作:
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
if self.view.window == nil {
self.setValue(nil, forKey: "view")
}
}
您不再需要卸载该视图。这就是为什么-[UIViewController viewDidUnload]
已被弃用。 documentation说:
在iOS 6.0中不赞成使用。视图不再在低内存条件下清除,因此此方法从不被调用。
在视图控制器编程指南,它说:
使用一个视图中绘制自己的记忆屏幕上的是潜在的相当大的。但是,当视图未附加到窗口时,系统会自动释放这些昂贵的资源。大多数视图使用的其余内存足够小,以至于系统不能自动清除并重新创建视图层次结构。
换句话说:如果视图层次结构被附接到一个窗口,它可以消耗大量的存储器。但是,如果视图层次结构没有附加到窗口,它很便宜。
所以答案是:不要试图卸载您的视图。无论如何,它不会给你太多回忆。当然,如果您可以释放任何可以恢复/重新计算的对象(如缓存),请在didReceiveMemoryWarning
中执行此操作。
我理解为什么意见不再自动发布。但是,我想在'viewDidLoad'中集中所有资源的初始化过程。所以当我释放一些东西的时候,我也想释放'view'。 – rintaro 2014-11-06 03:05:47
即使视图自动释放,并且视图层次本身不会维护成本高昂的资源,但仍然有价值的是无视视图控制器的主视图:许多VC集中了viewDidLoad中的状态设置。这可能包括重量级非视图层次状态数据,并且视图层次结构中的任何自定义视图也可能引用非视图数据。从轨道上剔除它是一种方法,可以确保a)它全部消失,并且b)一旦它再次需要时,它们都会在正常初始化的相同代码路径上重新初始化。 – rickster 2014-11-10 20:39:13
self.view.removeFromSuperview() – 2014-11-05 12:13:57
@ArturKucaj:...是完全不同的东西。 – DarkDust 2014-11-05 12:22:58