我已经从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
的电话?我在这里搜索了许多问题,但找不到答案,因为我没有任何保留周期。
答案 0 :(得分:1)
正如Tobi在他的回答中所说,deinit在对象被释放之前就被调用。
当不再有任何强引用对该对象进行释放时,该对象将被释放。 (没有人拥有该对象。)
为了回答您的特定问题,您需要查看如何创建视图控制器以及如何拥有它。
我已经有一段时间没有进行太多的Mac开发了,所以我对视图控制器的生命周期有些生疏,但这是我对其工作原理的回忆:
如果只有一个应用程序窗口,则它是视图控制器的所有者,并且该窗口永远不会关闭,这意味着视图控制器将永远不会被释放。
如果您退出该应用程序,我认为系统不会在终止该应用程序之前拆除您的窗口层次结构(除非您的应用程序是基于文档的应用程序,在这种情况下,系统会告知该应用程序关闭所有应用程序退出前先打开文档窗口。)
答案 1 :(得分:0)
在初始化类实例之前立即调用去初始化器 deallocated。
您的问题对我来说还不清楚。
但是,在预期的情况下无法触发deinit失败的通常原因是,您拥有一个保留周期,从而阻止了视图控制器的消失。
有时原因是您期望在这种情况下将破坏视图控制器是不正确的。
但是假设正确,保留周期就是原因。
另一个建议是使用 Hierarchies Debug 。
为您自己回答这些问题。
这是根UIViewController
吗?
是否正确解雇了?