【问题标题】:Is deinit called when init throws an exception?当 init 抛出异常时是否调用 deinit?
【发布时间】:2017-07-30 08:32:09
【问题描述】:

考虑以下示例类:

class SocketWrapper {
    let sock: Int32

    init() throws {
        try sock = SocketWrapper.createSocket()
    }

    deinit {
        close(sock)
    }
}

如果 createSocket() 抛出并且 init() 失败会发生什么?袜子将未初始化。当 init() 抛出时,是否仍然调用 deinit(在部分未初始化的对象上)?

【问题讨论】:

  • 我对此表示怀疑,因为如果createSocket 抛出,那么sock 永远不会被分配。这应该会给你一个提示,close(sock) 不会真正起作用。
  • 好的,我只是做了一个简单的例子。事实上,它没有按预期调用。只是没有找到任何规范的来源。

标签: swift


【解决方案1】:

deinit 不会在未正确初始化的实例上调用。

如果init 因某种原因失败,则类实例永远不会开始存在。因此,没有可以调用deinit 的实例。

如果可以在部分初始化的实例上调用 deinit,它将违反非可选属性的约定 - 在您的示例中,socket 属性不会被分配,它仍然可以在 deinit 中访问,因为非可选但没有值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2010-11-21
    • 2013-05-24
    • 2011-10-11
    • 1970-01-01
    • 2017-10-14
    相关资源
    最近更新 更多