两者都返回相同的指针。我知道- bytes
属于NSData
,为什么NSMutableData
会引入- mutableBytes
?它只是为了代码清晰度,所以更明显的是你访问可变数据?使用哪一个真的很重要吗?
NSMutableData* mydata = [[NSMutableData alloc] init];
[mydata appendData: [@"hello" dataUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"%p", [mydata mutableBytes]);
NSLog(@"%p", [mydata bytes]);
感谢。
答案 0 :(得分:3)
NSMutableData
可能提供单独的mutableBytes
方法有几个原因:
正如您在问题中所建议的那样,使用mutableBytes
会让读者明白您想要更改数据。
bytes
方法返回const void *
。 mutableBytes
方法返回void *
。如果要更改字节,则需要void *
而不需要const
限定符。 mutableBytes
方法无需丢弃const
限定符。
理论上可能有第三个原因:-[NSData mutableCopy]
方法可以返回指向与原始NSMutableData
相同的缓冲区的NSData
,并且只创建一个新的可变副本调用mutableBytes
时的缓冲区。但是,基于我非常有限的测试,我不认为它是以这种方式实现的。
答案 1 :(得分:0)
rob's answer的一个补充和他的评论:
@Dabbu NSData和NSMutableData将它们的内容存储为一个连续的内容 字节数组。
这里要记住的是iOS7中的这种行为已经改变了:现在NSData
/ NSMutableData
不能保证将内容保持为一个连续的数组。它可以存储为多个块。
因此,当您调用bytes
/ mutableBytes
时,如果需要,它们会将内容复制并压缩为一个连续的字节数组,然后返回指向此连续块的指针。
根据您尝试执行的操作,可能会导致意外的性能损失或大型缓冲区的内存消耗过多。