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

标签 swift

考虑以下示例类:

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/

相关文章:

ios - 在 Combine 中处理发布者错误的最佳实践是什么? (从 CoreLocation 发布航向更新)

ios - 如何在 prepareForSegue 中嵌入 UINavigationController?

ios - 如何在不使用 coreBluetooth 的情况下接近 BT 设备列表?

swift - 对成员 'append' 的模糊引用

ios - 我如何在没有 GeoFire 的情况下查询 Firebase 地理位置,以便根据两点之间的距离返回结果?

ios - UIview 中的两个 TableView fatal error

ios - Swift: '()' 不可转换为 '[String : AnyObject]'

ios - 摄像头下方有一个黑色的底部空间

ios - 如何在 Audiokit 中连续改变 AKMorphingOscillatorBank 的频率?

swift - 拖动 SWIFT 期间的 MKAnnotation 坐标