Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.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和#x27之间的差异;s mutableBytes和bytes方法_Objective C_Byte_Nsmutabledata - Fatal编程技术网

Objective c NSMutableData和#x27之间的差异;s mutableBytes和bytes方法

Objective c NSMutableData和#x27之间的差异;s mutableBytes和bytes方法,objective-c,byte,nsmutabledata,Objective C,Byte,Nsmutabledata,两者都返回相同的指针。我知道-bytes属于NSData,为什么NSMutableData引入了-mutableBytes?这仅仅是为了代码清晰,以便更明显地访问可变数据吗?用哪一个真的重要吗 NSMutableData* mydata = [[NSMutableData alloc] init]; [mydata appendData: [@"hello" dataUsingEncoding:NSUTF8StringEncoding]]; NSLog(@"%p", [mydata mutabl

两者都返回相同的指针。我知道
-bytes
属于
NSData
,为什么
NSMutableData
引入了
-mutableBytes
?这仅仅是为了代码清晰,以便更明显地访问可变数据吗?用哪一个真的重要吗

NSMutableData* mydata = [[NSMutableData alloc] init];
[mydata appendData: [@"hello" dataUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"%p", [mydata mutableBytes]);
NSLog(@"%p", [mydata bytes]);

谢谢。

为什么
NSMutableData
可以提供一个单独的
mutableBytes
方法,有几个原因:

  • 正如您在问题中所建议的,使用
    mutableBytes
    可以让读者清楚地知道您想要更改数据

  • bytes
    方法返回一个
    const void*
    mutableBytes
    方法返回一个
    void*
    。如果要更改字节,则需要一个不带常量限定符的
    void*
    mutableBytes
    方法消除了抛弃
    const
    限定符的需要

理论上可能还有第三个原因:
-[NSData mutableCopy]
方法可能返回一个
NSMutableData
,该方法指向与原始
NSData
相同的缓冲区,并且仅在调用
mutableBytes
时创建缓冲区的新的可变副本。但是,基于我有限的测试,我不认为它是以这种方式实现的。

对的一个补充和他的评论:

@Dabbu NSData和NSMutableData将其内容存储为一个连续的数据 字节数组

这里需要记住的是,这种行为在iOS7中发生了更改:现在
NSData
/
NSMutableData
不能保证将内容保留为一个连续数组。它可以存储为多个块

因此,当您调用
bytes
/
mutableBytes
时,如果需要,它们会将内容复制并展平到一个连续的字节数组中,然后返回指向该连续块的指针


根据您试图执行的操作,它可能会导致意外的性能损失或大缓冲区的内存消耗过多。

仅对@rob的回答稍加补充,即使从NSMutableData调用,
-bytes
方法也是只读的。Is是基类的一部分,但是如果您使用的是NSMutableData,并且需要字节的可变副本,则可以调用
-mutableBytes
函数,以便对其进行更改(这就是可变的含义)。有人知道NSMutableData数据管理的内部结构吗?
-mutableBytes
指针是否将所有数据精确地放在一行中,或者是否将数据分段,例如1kb,并且在每个分段的末尾是指向下一个1kb分段的指针?(我希望这是有意义的)。@Dabbu
NSData
NSMutableData
将其内容存储为一个连续的字节数组。