在特定情况下不调用 deinit

Gre*_*ndt 4 automatic-ref-counting swift

我有以下测试用例:我希望deinit在程序终止时被调用,但它从来没有。我是 Swift 的新手,但不认为这是预期的行为。(这不是在操场上)

class Test
{
   init() {
      print( "init" )
   }

   deinit {
      print( "deinit" )
   }
}

print("Starting app")

var test = Test()

print( "Ending App" )
Run Code Online (Sandbox Code Playgroud)

输出是:

Starting app
init
Ending App
Program ended with exit code: 0
Run Code Online (Sandbox Code Playgroud)

如果我将代码放在一个函数中然后调用该函数,我会得到预期的结果

Starting app
init
Ending App
deinit
Program ended with exit code: 0
Run Code Online (Sandbox Code Playgroud)

不应该在程序终止时调用对象的 deinit 吗?

Rob*_*ier 7

我希望在程序终止时调用 deinit

你不应该期待。程序终止时存在的对象通常不会被释放。内存清理留给操作系统(它释放所有程序的内存)。这是 Cocoa 中长期存在的优化,用于加速程序终止。

deinit仅用于释放资源(例如释放不在 ARC 下的内存)。在 ObjC 或 Swift 中没有等效的 C++ 析构函数。(C++ 和 Objective-C++ 对象在程序终止期间被销毁,因为这是规范所要求的。)