当初始化引发异常时是否调用 deinit?



考虑以下示例类:

class SocketWrapper {
let sock: Int32
init() throws {
try sock = SocketWrapper.createSocket()
}
deinit {
close(sock)
}
}

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

deinit

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

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

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

最新更新