Swift:为什么init?(长度length:Int)NSMutableData的初始化器failable?

问题描述:

内存分配可能会失败,但我认为Swift不处理这种情况。 上github代码调用非failable初始化Swift:为什么init?(长度length:Int)NSMutableData的初始化器failable?

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

编辑: 的代码是从原生斯威夫特Foundation框架斯威夫特3.未来

+1

有趣的问题。您可以在https://swift.org/community/#mailing-lists上的邮件列表中找到更好的答案。 –

+0

看起来他们只是预留了未来可能性失败而未事后更改接口。 – Darko

从SWIFT用户列表:

“Swift关于内存分配失败的策略是,如果无法处理固定大小的对象分配,则认为它是运行时失败的.OTOH,可以接受变量和任意大量分配的API应该是可分解的。类别。” -Chris

+0

所以它是failable,但它永远不会失败?如果分配失败会发生什么? – fpg1503

+0

它在Mac上失败。 NSMutableData(长度:1000000000000000)返回零 – soyer

+0

我得到克里斯的点,但我的疑问是:它可以**实际**失败?假设'malloc'失败并且内存为'.None',那么当您尝试访问这些数据时(例如访问不良),您可能会遇到崩溃。 – fpg1503