为什么空的 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。
我正在将项目从 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。