deinit 保证在程序结束时被调用吗?

Is deinit Guaranteed to be Called When the Program Finishes?

我有以下代码:

class Problem{
    init(){
        print("Problem init");
    }
    deinit{
        print("Problem deinit");
    }
    
}
var list = Problem();

输出:

Problem init

以下导致程序调用 deinit:

class Problem{
    init(){
        print("Problem init");
    }
    deinit{
        print("Problem deinit");
    }
    
}
do {
    var list = Problem();
}

问题:

P.S. 我知道很可能有一个明显的原因是我作为 Swift 的新手程序员忽略了。

这是因为这两个示例的范围不同,您通过添加 do-block.

在第一种情况下,当该代码为 运行 时,将在全局范围内(在 class 或结构定义之外)创建(初始化)Problem 实例Swift) 然后它只是坐在那里。程序不会结束,也永远不会取消初始化。

在第二种情况下,您在 do-block 内创建了 Problem 的实例,因此它的范围仅限于该块内。当 do-block 结束时,实例被取消引用,因此被取消初始化。