繁体   English   中英

NSData的dataWithBytesNoCopy和writeToFile

[英]NSData's dataWithBytesNoCopy and writeToFile

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

@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 = / Users /用户/ Library / Application Support / iPhone Simulator / 4.3 / Applications / 4C3155​​80-153D- 4FA7-9474-E17B58832515 / Library / Caches / file.pdf,NSUnderlyingError = 0x20de1fe0“操作无法完成。地址错误”}

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

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

因此,您需要执行以下操作:

buffer = realloc(buffer, length);

该代码没有任何意义。

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

  • 您有一个malloc(),为什么在循环后重新分配realloc()? 这是浪费时间,并且如果目标是在输入数据过长的情况下扩展缓冲区,则将无法按写入方式工作。

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

  • 同样,不要将这样的类别粘贴到现有的类上。 通常,它表示体系结构脆弱且分层不佳。 如果您确实走这条路,请至少为您的方法添加一些独特的前缀。

尚不清楚为什么会出现该特定错误。 那条路似乎有点不灵便,您是如何产生的?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM