【问题标题】:Difference between NSMutableData's mutableBytes and bytes methodsNSMutableData 的 mutableBytes 和 bytes 方法的区别
【发布时间】:2012-03-17 03:15:04
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: objective-c byte nsmutabledata


    【解决方案1】:

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

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

    • bytes 方法返回一个const void *mutableBytes 方法返回 void *。如果要更改字节,则需要不带 const 限定符的 void *mutableBytes 方法无需丢弃 const 限定符。

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

    【讨论】:

    • 只是对@rob 的回答稍加补充,- bytes 方法是只读的,即使是从 NSMutableData 调用。 Is 是基类的一部分,但是如果您使用 NSMutableData 并且想要字节的可变副本,则调用 - mutableBytes 函数以便您可以对其进行更改(这就是可变的意思)。
    • 有人知道 NSMutableData 数据管理的内部原理吗? - mutableBytes 指针是否将所有数据精确地放在一行中,还是将数据分段为例如 1kb 的块,并且在每个分段的末尾是指向下一个 1kb 分段的指针? (我希望这是有道理的)。
    • @Dabbu NSDataNSMutableData 将它们的内容存储为一个连续的字节数组。
    【解决方案2】:

    rob's answer 和他的评论的补充:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多