在样板macOS应用程序上未调用deinit

时间:2018-10-28 13:22:22

标签: swift macos deinit

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

答案 1 :(得分:0)

  

在初始化类实例之前立即调用去初始化器   deallocated

您的问题对我来说还不清楚。

但是,在预期的情况下无法触发deinit失败的通常原因是,您拥有一个保留周期,从而阻止了视图控制器的消失。

有时原因是您期望在这种情况下将破坏视图控制器是不正确的。

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

另一个建议是使用 Hierarchies Debug

为您自己回答这些问题。

这是根UIViewController吗?

是否正确解雇了?