我有以下测试用例:我希望在程序终止时调用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
在程序终止时是否应该调用对象?
答案 0 :(得分:2)
我希望在程序终止时调用deinit
你不应该期待那样。程序终止时存在的对象通常不会被释放。内存清理留给操作系统(释放所有程序的内存)。这是Cocoa中长期存在的优化,以加速程序终止。
deinit
仅用于释放资源(例如释放不在ARC下的内存)。在ObjC或Swift中没有等效的C ++析构函数。 (C ++和Objective-C ++对象在程序终止期间被销毁,因为这是规范要求的。)
答案 1 :(得分:-1)
There是一个类似的问题。
在Apple中,没有明确解释deinit
如何运作。只要它在类解除分配时由ARC调用。我认为当应用程序终止时,与常规运行时deiniting类相比,有不同的deiniting机制。或者主窗口可能会保留您的课程?无论如何,为了在app终止时执行代码,你应该使用Application delegate(如applicationWillTerminate
)。