【问题标题】:Is deinit Guaranteed to be Called When the Program Finishes?程序完成时是否保证调用 deinit?
【发布时间】:2022-01-20 15:30:06
【问题描述】:

我有以下代码:

class Problem{
    init(){
        print("Problem init");
    }
    deinit{
        print("Problem deinit");
    }
    
}
var list = Problem();

输出:

问题初始化

以下导致程序调用deinit

class Problem{
    init(){
        print("Problem init");
    }
    deinit{
        print("Problem deinit");
    }
    
}
do {
    var list = Problem();
}

问题:

  • 为什么没有第一次调用deinit
  • 有没有办法保证deinit 在我无法控制其编写方式的代码(即用户代码)中始终被调用Problem

P.S.我知道,作为一个刚接触 Swift 的程序员,我很可能忽略了一个明显的原因。

【问题讨论】:

    标签: swift memory-management memory-leaks destructor


    【解决方案1】:

    这是因为您通过添加do-block 创建的这两个示例之间的范围不同。

    在第一个场景中,当该代码运行时,Problem 的实例在全局范围(在 Swift 中的类或结构定义之外)创建(初始化),然后它就坐在那里。程序不会结束,也不会被取消初始化。

    在第二种情况下,您在do-block 内创建Problem 的实例,因此它的范围仅限于该块内。当do-block 结束时,实例被取消引用,从而被取消初始化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-17
      • 2020-08-12
      • 1970-01-01
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多