为什么空的NSMutableData是可选的?

时间:2017-06-09 20:58:31

标签: objective-c swift nsmutabledata

我将项目从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

据我所知,无论哪种方式都得到相同的结果,为什么只有第一个可选?是否有任何理由强行解开它是不安全的,或者以第二种方式做任何不利之处?

2 个答案:

答案 0 :(得分:2)

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

如果我需要分配大量字节而且我不确定 malloc 是否会成功,那么我会使用一个保护声明:

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

答案 1 :(得分:2)

The documentation states返回的对象与malloc(_:)。 malloc might fail: If the function failed to allocate the requested block of memory, a null pointer is returned.在Objective-C中具有相同的内存对齐保证这意味着initWithLength:会返回nil - 因为没有语言功能来表达这一点,这可能会被忽视。
但是很快就存在这样的语言特征:可选项和可选的初始化程序 所以Objective-C和Swift在这里做同样的事情,但只有Swift对此诚实,而在Objective-C中,你可能会在没有意识到的情况下获得nil。