【问题标题】:NSData's dataWithBytesNoCopy and writeToFileNSData 的 dataWithBytesNoCopy 和 writeToFile
【发布时间】:2011-09-21 10:02:51
【问题描述】:

我有一个类似这样的类别方法:

@implementation NSData (additions)
- (id)someFunc {

char *buffer = malloc(255);
NSUInteger length = 0;
while (true) {
    // . . . fill buffer[length++];
}

realloc(buffer, length);
return [NSData dataWithBytesNoCopy:buffer length:length freeWhenDone:NO];
}

然后我正在尝试写入返回的数据(称之为 NSData *fileData):

NSError *error;
NSData fileData = [NSData someFunc];
[fileData writeToFile:somePath options:NSDataWritingAtomic error:&error];

我收到一个错误:

错误域=NSCocoaErrorDomain Code=512 "无法操作 完全的。 (可可错误 512。)” 用户信息=0x20deffd0 {NSFilePath=/用户/用户/库/应用程序 支持/iPhone 模拟器/4.3/Applications/4C3155​​80-153D-4FA7-9474-E17B58832515/Library/Caches/file.pdf, NSUnderlyingError=0x20de1fe0 "的 操作无法完成。坏的 地址"}

路径存在且有效。我认为问题在于返回的 NSData 只是一个围绕分配有 malloc 的数组的轻包装,而 writeToFile 不知道如何处理这个问题。有人看到我做错了吗?

【问题讨论】:

  • 需要保存realloc返回的地址:buffer = realloc(buffer, length);
  • @DarkDust 这就是问题所在,请给出答案,我会接受。

标签: iphone ios memory file-io nsdata


【解决方案1】:

当您调用realloc 时,您必须保存返回的指针,因为realloc 可能会分配一个新缓冲区并将旧位置的内容复制到该新位置。之后旧位置是freed,因此无效。另一个 malloc 调用可能会覆盖该旧位置。

所以你需要这样做:

buffer = realloc(buffer, length);

【讨论】:

  • 这不适用于 OP 代码的结构方式。 IE。循环后的realloc() 没有任何用处。如果输入数据对于原始malloc(255) 来说太大,则内存已损坏。
【解决方案2】:

那段代码没有任何意义。

  • 显示用于填充缓冲区的代码

  • 你有一个 malloc(),为什么你在循环之后 realloc()?这是对周期的浪费,如果目标是在输入数据太长的情况下扩展缓冲区,则它不会像写入的那样工作。

  • 必须检查writeToFile:options:error:的返回值才能知道是否有错误;你不能直接检查错误。

  • 另外,不要将这样的类别粘贴到现有类上。一般来说,它表明架构脆弱且分层不良。如果你真的走这条路,至少在你的方法前面加上一些独特的东西。

目前尚不清楚为什么会出现该特定错误。这条路径可能看起来有点不稳定,你是如何生成它的?

【讨论】:

  • 填充缓冲区的代码最终并不重要,但我知道应该如何包含它。调用 realloc 是因为它正在解码 base64 编码的字符串,并且原始缓冲区最终可能比实际使用的字节大得多。我不清楚我是如何读取错误的,但我确实使用了 writeToFile:options:error。而且我个人不使用类别,代码是由 Wsdl2Obj c 生成的,这是一个从 web 服务描述生成objective-c 代码的工具。感谢您仍然尝试回答。
  • 在循环外使用 realloc 毫无意义,可能会导致内存破坏。如果不重新构建代码,DarkDust 的建议就行不通(除非数据小于原始缓冲区,从而使 realloc 变得毫无意义)。
猜你喜欢
  • 2012-05-18
  • 1970-01-01
  • 2011-08-02
  • 2011-11-06
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多