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();
}
问题:
- 为什么
deinit
不是第一次调用?
- 有没有办法保证
deinit
在我无法控制其编写方式(即用户代码)的代码中始终被调用 Problem
?
P.S. 我知道很可能有一个明显的原因是我作为 Swift 的新手程序员忽略了。
这是因为这两个示例的范围不同,您通过添加 do-block
.
在第一种情况下,当该代码为 运行 时,将在全局范围内(在 class 或结构定义之外)创建(初始化)Problem
实例Swift) 然后它只是坐在那里。程序不会结束,也永远不会取消初始化。
在第二种情况下,您在 do-block
内创建了 Problem
的实例,因此它的范围仅限于该块内。当 do-block
结束时,实例被取消引用,因此被取消初始化。
我有以下代码:
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();
}
问题:
- 为什么
deinit
不是第一次调用? - 有没有办法保证
deinit
在我无法控制其编写方式(即用户代码)的代码中始终被调用Problem
?
P.S. 我知道很可能有一个明显的原因是我作为 Swift 的新手程序员忽略了。
这是因为这两个示例的范围不同,您通过添加 do-block
.
在第一种情况下,当该代码为 运行 时,将在全局范围内(在 class 或结构定义之外)创建(初始化)Problem
实例Swift) 然后它只是坐在那里。程序不会结束,也永远不会取消初始化。
在第二种情况下,您在 do-block
内创建了 Problem
的实例,因此它的范围仅限于该块内。当 do-block
结束时,实例被取消引用,因此被取消初始化。