Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么空NSMutableData是可选的?_Objective C_Swift_Nsmutabledata - Fatal编程技术网

Objective c 为什么空NSMutableData是可选的?

Objective c 为什么空NSMutableData是可选的?,objective-c,swift,nsmutabledata,Objective C,Swift,Nsmutabledata,我正在将一个项目从Objective-C转换为Swift。其中有一个NSMutableData对象,最初是这样实例化的: NSMutableData *buffer = [[NSMutableData alloc] initWithLength:65535]; 在Swift中,当我尝试以相同的方式实例化它时,它会生成一个可选的,而我正在使用它的函数不能与可选的一起工作,因此如果我这样做,它会变得有点混乱,除非我可以确定强制展开它是安全的: let buffer = 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
就我所知,无论哪种方法,我都会得到相同的结果,那么为什么只有第一种方法是可选的呢?是否有任何理由不安全地强制展开它,或者第二种方法有任何缺点?

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

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

guard let buffer = NSMutableData(length: N) else { return }
我猜initlength:是尝试分配一定数量字节的安全方法,它可能会安全地失败并返回nil。但是,如果更改可变数据对象的length属性并且malloc失败,则会引发异常

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

guard let buffer = NSMutableData(length: N) else { return }
:返回的对象具有与malloc\相同的内存对齐保证:。在Objective-C中的malloc,这意味着initWithLength:将返回nil——因为没有语言特性来表达这一点,这可能会被忽略。 但在swift中确实存在这样的语言特征:可选的和可选的初始值设定项。 因此Objective-C和Swift在这里也做同样的事情,但只有Swift是诚实的,而在Objective-C中,您可能会在没有意识到的情况下得到一个nil。

:返回的对象具有与malloc相同的内存对齐保证:。在Objective-C中的malloc,这意味着initWithLength:将返回nil——因为没有语言特性来表达这一点,这可能会被忽略。 但在swift中确实存在这样的语言特征:可选的和可选的初始值设定项。
因此,Objective-C和Swift在这里也做同样的事情,但只有Swift是诚实的,而在Objective-C中,您可能会在没有意识到的情况下得到零。

我认为最有可能的答案是,如果没有足够的内存分配,NSMutableData将返回零。为了安全起见,我可能永远不会直接使用setter,而是使用类似于if let buffer=NSMutableDatalength:65535{…}的东西。我认为最可能的答案是,如果没有足够的内存分配,NSMutableData将返回nil。为了安全起见,我可能永远不会直接使用setter,而是可能会使用类似于if let buffer=NSMutableDatalength:65535{…}嗯,可能就是这样。但是我处理的文件最多只有几兆字节,所以可能没有风险?@JohnMontgomery:在内存耗尽之前,用户是否有可能创建多个文件?另外,如果你正在编写一个iOS或OSX应用程序,可能会有不同。它是从服务器上下载的几个文件,在iOS上。但我想我可以在警卫室工作,不管怎样,只是为了安全。嗯,可能就是这样。但是我处理的文件最多只有几兆字节,所以可能没有风险?@JohnMontgomery:在内存耗尽之前,用户是否有可能创建多个文件?另外,如果你正在编写一个iOS或OSX应用程序,可能会有不同。它是从服务器上下载的几个文件,在iOS上。但是我认为我可以在警卫中工作,不管怎样,只是为了安全。在Objective-C中,这个构造函数被定义为nullable instancetype。但即使在可空性表示法之前,初始值设定项也可以返回nil。你的快速讨论很好,但称Objective-C不诚实是不正确的。在过去,任何对象引用都可能是nil。我想在回答中强调的是,swift迫使程序员考虑nil的情况。objc不会这样做,即使使用nullability标记,因为这只表示结果可能为nil。在swift中,您将知道某些内容为零。在Objective-C中,此构造函数定义为可为空的instancetype。但即使在可空性表示法之前,初始值设定项也可以返回nil。你的快速讨论很好,但称Objective-C不诚实是不正确的。在过去,任何对象引用都可能是nil。我想在回答中强调的是,swift迫使程序员考虑nil的情况。objc不会这样做,即使使用nullability标记,因为这只表示结果可能为nil。在斯威夫特,你会知道有些东西是零。