我已经从macOS Cocoa应用程序模板创建了新的应用程序。我所做的唯一更改是在NSViewController中添加了deinit。所以现在它看起来像这样(完整的代码):
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呼叫?我在这里搜索了许多问题,但找不到答案,因为我没有任何保留周期。
发布于 2018-10-28 21:55:23
正如Tobi在他的回答中所说,deinit在对象被释放之前被调用。
当一个对象不再有任何强引用时,它将被释放。(没有人再拥有该对象。)
为了回答你的特定问题,你需要看看你的视图控制器是如何创建的,以及谁拥有它。
我已经有一段时间没有做太多的Mac开发了,所以我对视图控制器的生命周期有点生疏,但这是我对它是如何工作的回忆:
如果你只有一个应用程序窗口,它是视图控制器的所有者,并且窗口永远不会关闭,这意味着视图控制器永远不会被释放。
如果您退出应用程序,我认为系统不会在终止应用程序之前删除您的窗口层次结构(除非您的应用程序是基于文档的应用程序,在这种情况下,应用程序将被告知在退出之前关闭所有的文档窗口)。
发布于 2018-10-28 21:36:32
在类实例为deallocated之前立即调用反初始化器。
虽然你的问题我不清楚。
但是,无法按预期触发deinit的常见原因是,您有一个保留周期,可以防止视图控制器消失。
有时,原因是您认为视图控制器在这种情况下会被销毁的预期是不正确的。
但假设它是正确的,一个保留周期是原因。
另一个建议是使用。
为你自己回答这些问题。
这是根UIViewController吗?
它被正确地删除了吗?
https://stackoverflow.com/questions/53031986
复制相似问题