【问题标题】:NSMutableData datawithBytesNoCopy:length:freeWhenDone: seems to make a copy of the buffer provided to itNSMutableData datawithBytesNoCopy:length:freeWhenDone: 似乎复制了提供给它的缓冲区
【发布时间】:2013-09-12 17:01:36
【问题描述】:

根据苹果文档,类方法

+datawithBytesNoCopy:length:freeWhenDone:

继承自 NSData

创建并返回一个数据对象,该对象保存来自给定缓冲区的给定字节数。

但是

NSUInteger len = 1024;
char *buffer = malloc(len);
NSMutableData *data = [NSMutableData dataWithBytesNoCopy:buffer length:len freeWhenDone:YES];
char *dataBytes = data.mutableBytes;
NSLog(@"%@", dataBytes == buffer ? @":D" : @":(");

打印

:(

该方法似乎实际上是在复制,而我预计它不会。 我用错了吗? 等效的 NSData 方法按预期工作。 我如何创建一个 NSMutableData 对象指向一个已经存在的缓冲区而不获取任何所有权?

【问题讨论】:

  • 我也不明白...我也希望 :D -- 闻起来可能像个虫子
  • 我过去曾将此报告为一个错误,Apple 表示这是故意的。非常烦人。根据他们的说法,“这符合预期 - 避免此副本会导致太多情况,其中键入为 NSData 的内容预期具有来自 -bytes 的不可更改内容”

标签: cocoa nsdata


【解决方案1】:

我猜你只是不能做你想做的事。毕竟,如果您有一个 NSMutableData 并向其附加更多数据,则需要重新分配缓冲区,并且不再使用您提供的指针。

Apple 的Binary Data Programming Guide 表示,在NSMutableData 的情况下,无论如何都会复制字节。

【讨论】:

  • 他得到了原始字节......它不会神奇地重新分配 C 中的东西......无论如何这不是答案
  • 我认为这个答案说得很好。 NSMutableData 有一个appendData: 方法。这应该如何与 init 调用中给出的缓冲区一起工作? - 它可以与 NSData 一起正常工作,但 NSMutableData 可能会制作一个可变副本。
  • 确实,appendData: 的捕获是有道理的。
猜你喜欢
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
相关资源
最近更新 更多