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