【发布时间】:2018-08-03 16:27:36
【问题描述】:
我有以下测试用例:我希望在程序终止时调用deinit,但它永远不会。我是 Swift 的新手,但不认为这是预期的行为。 (这不是在操场上)
class Test
{
init() {
print( "init" )
}
deinit {
print( "deinit" )
}
}
print("Starting app")
var test = Test()
print( "Ending App" )
输出是:
Starting app
init
Ending App
Program ended with exit code: 0
如果我将代码放在一个函数中,然后调用该函数,我会得到预期的结果
Starting app
init
Ending App
deinit
Program ended with exit code: 0
不应该在程序终止时调用对象的 deinit 吗?
【问题讨论】:
-
因为它是在顶层定义的,
test在技术上是一个全局变量,因此它实际上永远不会超出范围。 -
如果将你的“主代码”放在
do { ... }块中,那么 deinit 将被调用。 -
@Hamish 这没有任何意义,它在程序终止时超出了范围! (或者至少在逻辑上应该)。很容易解决,但它真的没有意义。
-
@GregorBrandt 你可以这么说,但是去初始化程序不能在 after 程序终止后运行 :) 虽然话虽如此,但顶级 main.swift 范围已经很特别了(全局变量没有惰性初始化器,您可以抛出未捕获的错误等),因此取消初始化器在程序终止之前运行可能是合理的;随时file a bug if you want。
标签: swift automatic-ref-counting