init 抛出异常时是否调用了 deinit?

Ale*_*ßen 3 swift

考虑以下示例类:

class SocketWrapper {
    let sock: Int32

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

    deinit {
        close(sock)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Sul*_*han 5

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

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

如果deinit可以在部分初始化的实例上调用,它会破坏非可选属性的契约 - 在您的示例中,该socket属性不会被分配,它仍然可以deinit作为非可选但没有值来访问。