【发布时间】:2015-10-14 20:32:30
【问题描述】:
我最近一直在阅读大量关于 Swift initilization 的内容,其中一个似乎有一些优点的解决方案是利用惰性变量来避免可选选项的厄运和阴暗,尤其是在扩展 UIViewControllers 或沿这些线的其他类时.考虑到这一点,我的代码如下所示:
final class MyViewController : UIViewController {
lazy private var myOtherViewController: MyOtherViewController = MyOtherViewController()
deinit {
// myOtherViewController = nil // Can't do this. Expression resolves to an unused l-value
}
override func viewDidLoad() {
super.viewDidLoad()
myOtherViewController.foo();
}
}
// elsewhere...
final class MyOtherViewController : UIViewController {
deinit {
print("Deinit!")
}
}
在此处的示例中似乎MyOtherViewController 的deinit 方法似乎永远不会触发,但我也无法使myOtherViewController deinit。不允许将其设置为 nil。有什么我想念的东西迫使MyOtherViewController 保留吗?还是我只是对垃圾收集器不耐烦了?
【问题讨论】:
-
为什么需要
deinit?大多数情况下,根据文档,你没有,我不明白你为什么这样做......developer.apple.com/library/ios/documentation/Swift/Conceptual/… -
这是一个架构问题,比什么都重要。我的目标是仅在需要时创建对象,并且在不再需要时仍然可以控制将其删除,例如内存警告。可选的似乎是要走的路。
-
顺便说一句,保持对另一个视图控制器的强引用有点令人不安。同样,我建议不要以与将此控制器添加到视图控制器层次结构的方式(例如,包含调用、呈现等)断开连接的方式实例化视图控制器。如果你需要自己引用这个其他视图控制器,你通常会有一个弱引用,并让视图控制器层次结构来处理所有权。