簡體   English   中英

未在樣板 macOS 應用程序上調用 deinit

[英]deinit not called on boilerplate macOS app

我從 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調用? 我在這里搜索了許多問題,但找不到答案,因為我沒有任何保留周期。

正如 Tobi 在他的回答中所說, deinit 在對象被釋放之前被調用。

當對象不再有任何強引用時,它就會被釋放。 (沒有人再擁有該對象。)

為了回答您的具體問題,您需要查看您的視圖控制器是如何創建的以及擁有它的人。

我有一段時間沒有做太多的 Mac 開發,所以我對視圖控制器生命周期有點生疏,但這是我對它如何工作的回憶:

如果你只有一個應用程序窗口,它是視圖控制器的所有者,並且窗口永遠不會關閉,這意味着視圖控制器永遠不會被釋放。

如果您退出應用程序,我認為系統不會在終止應用程序之前拆除您的窗口層次結構(除非您的應用程序是基於文檔的應用程序,在這種情況下,應用程序將被告知關閉所有文檔窗口之前退出。)

釋放類實例之前立即調用析構器。

雖然你的問題我不清楚。

但是在預期時未能觸發 deinit 的通常原因是您有一個保留周期,可以防止您的視圖控制器消失。

有時原因是您認為在這種情況下視圖控制器會被銷毀是不正確的。

但假設它是正確的,一個保留周期就是原因。

另一個建議是使用Hierarchies Debug

為你自己回答這些問題。

這是根UIViewController嗎?

它被正確解雇了嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM