[英]deinit called in app but not in unit test when dismissing view controller
[英]deinit not called on boilerplate macOS app
我從 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
調用? 我在這里搜索了許多問題,但找不到答案,因為我沒有任何保留周期。
正如 Tobi 在他的回答中所說, deinit 在對象被釋放之前被調用。
當對象不再有任何強引用時,它就會被釋放。 (沒有人再擁有該對象。)
為了回答您的具體問題,您需要查看您的視圖控制器是如何創建的以及擁有它的人。
我有一段時間沒有做太多的 Mac 開發,所以我對視圖控制器生命周期有點生疏,但這是我對它如何工作的回憶:
如果你只有一個應用程序窗口,它是視圖控制器的所有者,並且窗口永遠不會關閉,這意味着視圖控制器永遠不會被釋放。
如果您退出應用程序,我認為系統不會在終止應用程序之前拆除您的窗口層次結構(除非您的應用程序是基於文檔的應用程序,在這種情況下,應用程序將被告知關閉所有文檔窗口之前退出。)
在釋放類實例之前立即調用析構器。
雖然你的問題我不清楚。
但是在預期時未能觸發 deinit 的通常原因是您有一個保留周期,可以防止您的視圖控制器消失。
有時原因是您認為在這種情況下視圖控制器會被銷毀是不正確的。
但假設它是正確的,一個保留周期就是原因。
另一個建議是使用Hierarchies Debug 。
為你自己回答這些問題。
這是根UIViewController
嗎?
它被正確解雇了嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.