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分段的指针?(我希望这是有意义的)。@DabbuNSData
和NSMutableData
将其内容存储为一个连续的字节数组。