为什么空的 NSMutableData 是可选的?

Why would an empty NSMutableData be optional?

我正在将项目从 Objective-C 转换为 Swift。其中,有一个NSMutableData对象,原来是这样实例化的:

NSMutableData *buffer = [[NSMutableData alloc] initWithLength:65535];

在 Swift 中,当我尝试以相同的方式实例化它时,它会生成一个可选的(我正在使用它的函数不适用于可选的,所以它变得有点混乱如果我这样做,除非我能确定强行打开它是安全的):

let buffer = NSMutableData(length: 65535) // optional

但我可以分两步完成看起来完全相同的事情,并得到一个非可选的:

let buffer = NSMutableData() // not optional
buffer.length = 65535

据我所知,两种方法都得到了相同的结果,那么为什么只有第一个是可选的?有什么理由强制解开它是不安全的,或者以第二种方式解开它有什么缺点吗?

我想 init(length:) 是尝试分配一定数量字节的安全方法,可能会安全地失败并且 return 。但是,如果您更改可变数据对象的长度 属性 并且 malloc 失败,则会抛出异常。

如果我需要分配大量字节并且不确定 malloc 是否会成功,那么我会使用保护语句:

guard let buffer = NSMutableData(length: N) else { return }

The documentation states: The returned object has the same memory alignment guarantees as malloc(_:). And malloc might fail: If the function failed to allocate the requested block of memory, a null pointer is returned. 在 Objective-C 中,这意味着 initWithLength: 会 return nil — 因为没有语言功能来表达这一点,这可能会未被注意到。
但是在 swift 中确实存在这样的语言特性:Optionals 和 optional initialisers。
所以 Objective-C 和 Swift 在这里做同样的事情,但只有 Swift 是诚实的,而在 Objective-C 中你可能会在没有意识到的情况下得到一个 nil。