考虑以下示例类:
class SocketWrapper {
let sock: Int32
init() throws {
try sock = SocketWrapper.createSocket()
}
deinit {
close(sock)
}
}
如果 createSocket() 抛出并且 init() 因此失败会怎样? socks 将保持未初始化状态。当 init() 抛出时, deinit 是否仍然被调用(在部分未初始化的对象上)?
最佳答案
deinit
不会在未正确初始化的实例上调用。
如果 init
由于某种原因失败,则类实例永远不会开始存在。因此,没有可以调用 deinit
的实例。
如果 deinit
可以在部分初始化的实例上调用,它将破坏非可选属性的契约 - 在您的示例中, socket
属性不会被分配并且它仍然可以在 deinit
中作为非可选但没有值的方式访问。
关于swift - init抛出异常时是否调用deinit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45397897/