如何从UIViewController的斯威夫特

问题描述:

卸载self.view据View Controller Programming Guide,我们可以明确地分配到nil卸载self.viewUIViewControllerself.view如何从UIViewController的斯威夫特

但是在斯威夫特,在UIViewControllerview属性被声明为

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' 

    } 
} 

是否有另一种方式做到这一点的斯威夫特?

+0

self.view.removeFromSuperview() – 2014-11-05 12:13:57

+0

@ArturKucaj:...是完全不同的东西。 – DarkDust 2014-11-05 12:22:58

setValue(nil, forKey:"view")似乎工作:

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

'view'属性不允许设置nil可能是审计过的Swift API中的一个错误。 (根据苹果开发者论坛上的建议,你应该在[title]中使用#IUO [提交bug](http://bugreport.apple.com)。)这是一个很好的解决方法。 – rickster 2014-11-10 20:33:17

+3

'self.view = nil'现在可以工作 – Gob 2015-09-16 22:04:34

您不再需要卸载该视图。这就是为什么-[UIViewController viewDidUnload]已被弃用。 documentation说:

在iOS 6.0中不赞成使用。视图不再在低内存条件下清除,因此此方法从不被调用。

视图控制器编程指南,它说:

使用一个视图中绘制自己的记忆屏幕上的是潜在的相当大的。但是,当视图未附加到窗口时,系统会自动释放这些昂贵的资源。大多数视图使用的其余内存足够小,以至于系统不能自动清除并重新创建视图层次结构。

换句话说:如果视图层次结构被附接到一个窗口,它可以消耗大量的存储器。但是,如果视图层次结构没有附加到窗口,它很便宜。

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

+0

我理解为什么意见不再自动发布。但是,我想在'viewDidLoad'中集中所有资源的初始化过程。所以当我释放一些东西的时候,我也想释放'view'。 – rintaro 2014-11-06 03:05:47

+0

即使视图自动释放,并且视图层次本身不会维护成本高昂的资源,但仍然有价值的是无视视图控制器的主视图:许多VC集中了viewDidLoad中的状态设置。这可能包括重量级非视图层次状态数据,并且视图层次结构中的任何自定义视图也可能引用非视图数据。从轨道上剔除它是一种方法,可以确保a)它全部消失,并且b)一旦它再次需要时,它们都会在正常初始化的相同代码路径上重新初始化。 – rickster 2014-11-10 20:39:13