【问题标题】:Swift: Why is the init?(length length: Int) NSMutableData's initializer failable?Swift:为什么 init?(length length: Int) NSMutableData 的初始化程序会失败?
【发布时间】:2016-04-14 11:34:49
【问题描述】:

内存分配可能会失败,但我认为 Swift 无法处理这种情况。 github 上的代码调用了一个不可失败的初始化器

public convenience init?(length: Int) {
    let memory = malloc(length)
    self.init(bytes: memory, length: length, copy: false) { buffer, amount in
        free(buffer)
    }
}

编辑: 代码来自 Swift 3 中的原生 Swift Foundation 框架。

【问题讨论】:

  • 有趣的问题。您可能会在swift.org/community/#mailing-lists 的其中一个邮件列表中获得更好的答案。
  • 看起来他们只是保留它以备将来可能失败而无需更改界面。

标签: swift swift2 nsdata initializer failable


【解决方案1】:

来自 swift-users 列表:

“Swift 关于内存分配失败的策略是,如果无法处理固定大小的对象分配,则认为它是运行时失败。OTOH,可以采用变量和任意大数量进行分配的 API 应该是失败的。NSData 下降归入后一类。” -克里斯

【讨论】:

  • 所以它可以失败但它永远不会失败?如果分配失败会发生什么?
  • 在 mac 上失败。 NSMutableData(length: 1000000000000000) 返回 nil
  • 我明白克里斯的观点,但我的疑问是:它实际上会失败吗?假设malloc 失败并且内存为.None,您在尝试访问该数据时可能会崩溃(即错误访问)。
  • 使用新的 Swift-Foundation?考虑到调用被委托给一个不可失败的初始化程序,这对我来说有点有趣。
  • 不,不是 Swift 基金会。使用当前的 Xcode 和 swift 2.2,它返回 nil 并将一些错误消息写入标准输出。 $R0:NSMutableData? = 无
猜你喜欢
  • 2012-04-11
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 2014-11-22
  • 2016-11-15
  • 1970-01-01
相关资源
最近更新 更多