2

两者都返回相同的指针。我知道- bytes属于NSData,为什么要NSMutableData介绍- mutableBytes?只是为了代码清晰,所以更明显的是您正在访问可变数据?使用哪一个真的很重要吗?

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

谢谢。

4

2 回答 2

3

有几个原因NSMutableData可以提供单独的mutableBytes方法:

  • 正如您在问题中建议的那样, usingmutableBytes使读者清楚您要更改数据。

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

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

于 2012-03-17T03:40:54.500 回答
0

抢劫者的回答和他的评论的一个补充:

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

这里要记住的是,这种行为在 iOS7 中有所改变:现在NSData/NSMutableData不保证将内容保持为一个连续的数组。它可以存储为多个块。

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

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

于 2017-06-20T15:04:29.600 回答