在特定情况下没有被称为deinit

时间:2018-02-23 15:09:05

标签: swift automatic-ref-counting

我有以下测试用例:我希望在程序终止时调用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

在程序终止时是否应该调用对象?

2 个答案:

答案 0 :(得分:2)

  

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

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

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

答案 1 :(得分:-1)

There是一个类似的问题。

在Apple中,没有明确解释deinit如何运作。只要它在类解除分配时由ARC调用。我认为当应用程序终止时,与常规运行时deiniting类相比,有不同的deiniting机制。或者主窗口可能会保留您的课程?无论如何,为了在app终止时执行代码,你应该使用Application delegate(如applicationWillTerminate)。