我已经从macOS Cocoa应用程序模板创建了新的应用程序。我所做的唯一更改是在NSViewController
中添加了deinit
。所以现在看起来是这样的(完整的代码(:
import Cocoa
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
func doSomething()
{
var a = 10
a = a + 1
print(a)
}
deinit {
doSomething()
print("deinit called")
}
}
为什么我没有看到deinit
呼叫?我在这里搜索了很多问题,但找不到答案,因为我没有任何保留周期。
正如Tobi在回答中所说,deinit在对象被释放之前就被调用了。
当一个对象不再有任何强引用时,它就会被释放。(没有人再拥有这个对象了。(
为了回答你的具体问题,你需要看看你的视图控制器是如何创建的,以及谁拥有它
我已经有一段时间没有做太多的Mac开发了,所以我对视图控制器的生命周期有点生疏,但以下是我对其工作原理的回忆:
如果你只有一个应用程序窗口,它是视图控制器的所有者,并且该窗口永远不会关闭,这意味着视图控制器永远不会被解除分配。
如果你退出应用程序,我认为系统不会在终止应用程序之前拆除你的窗口层次结构(除非你的应用程序是基于文档的应用程序,在这种情况下,应用程序会被告知在退出之前关闭所有文档窗口。(
在类实例被调用之前立即调用去初始化程序解除分配。
尽管我不清楚你的问题。
但是,在预期的情况下未能触发去init的常见原因是,您有一个保留周期,可以防止视图控制器不存在。
有时原因是您对视图控制器在这种情况下会被破坏的预期是不正确的。
但假设它是正确的,保留周期就是原因。
另一个建议是使用层次结构调试。
为自己回答这些问题。
这是根UIViewController
吗?
它被恰当地驳回了吗?