NSData的dataWithBytesNoCopy和writeToFile

时间:2011-06-23 16:58:25

标签: iphone ios memory file-io nsdata

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

@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   代码= 512“操作不可能   完成。 (可可错误512.)“   的UserInfo = 0x20deffd0   {NSFilePath = /用户/用户/库/应用程序   支持/ iPhone   模拟器/ 4.3 /应用/ 4C3155​​80-153D-4FA7-9474-E17B58832515 /图书馆/缓存/ file.pdf,   NSUnderlyingError = 0x20de1fe0“The   操作无法完成。坏   地址“}

路径存在且有效。我认为问题是返回的NSData只是一个围绕用malloc分配的数组的轻量级包装器,而writeToFile不知道如何处理它。有谁看到我做错了什么?

2 个答案:

答案 0 :(得分:1)

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

所以你需要这样做:

buffer = realloc(buffer, length);

答案 1 :(得分:0)

该代码没有任何意义。

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

  • 你有一个malloc(),为什么你在循环之后realloc()?这是浪费周期,如果目标是在输入数据太长的情况下扩展缓冲区,则无法按照书面形式工作。

  • 您必须检查writeToFile:options:error:的返回值,以了解是否存在错误;你不能直接检查错误。

  • 另外,不要将类似的类别粘贴到现有类中。一般来说,它表明一个脆弱且分层不佳的架构。如果你选择这条路线,至少在你的方法前面添加一些独特的东西。

目前尚不清楚为什么会出现这种特殊错误。那道路似乎有点不稳定,你是如何产生它的呢?