考虑以下示例类:
class SocketWrapper {
let sock: Int32
init() throws {
try sock = SocketWrapper.createSocket()
}
deinit {
close(sock)
}
}
如果 createSocket(( 抛出并且 init(( 因此失败会发生什么? 袜子将保持未初始化状态。当 init(( 抛出时,deinit 是否仍然被调用(在部分未初始化的对象上(?
deinit
不会在未正确初始化的实例上调用。
如果init
由于某种原因失败,则类实例永远不会开始存在。因此,没有可以调用deinit
的实例。
如果可以在部分初始化的实例上调用deinit
,则会破坏非可选属性的协定 - 在您的示例中,socket
属性不会被分配,并且仍然可以在deinit
中作为非可选但没有值访问。