3

我已经从 macOS Cocoa App 模板创建了新的应用程序。我所做的唯一更改是添加deinitNSViewController. 所以现在它看起来像这样(完整代码):

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电话?我在这里搜索了许多问题,但找不到答案,因为我没有任何保留周期。

4

2 回答 2

1

正如 Tobi 在他的回答中所说, deinit 在对象被释放之前被调用。

当不再有任何强引用时,对象将被释放。(没有人拥有该对象了。)

为了回答您的具体问题,您需要查看您的视图控制器是如何创建的以及谁拥有它。

我有一段时间没有做太多 Mac 开发了,所以我对视图控制器的生命周期有点生疏,但这是我对其工作原理的回忆:

如果您只有一个应用程序窗口,它是视图控制器的所有者,并且该窗口永远不会关闭,这意味着视图控制器永远不会被释放。

如果您退出应用程序,我认为系统不会在终止应用程序之前拆除您的窗口层次结构(除非您的应用程序是基于文档的应用程序,在这种情况下,应用程序将被告知关闭所有文档窗口之前退出。)

于 2018-10-28T13:55:23.323 回答
0

在释放类实例之前立即调用 deinitializer 。

尽管你的问题我不清楚。

但是,按预期触发 deinit 失败的通常原因是您有一个保留周期,可以防止您的视图控制器不存在。

有时原因是您对视图控制器在这种情况下会被销毁的期望是不正确的。

但是假设它是正确的,保留周期就是原因。

另一个建议是使用Hierarchies Debug

为你自己回答这些问题。

这是根UIViewController吗?

是否正确解雇?

于 2018-10-28T13:36:32.017 回答