我有一个像这样做的类别方法:
@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 /应用/ 4C315580-153D-4FA7-9474-E17B58832515 /图书馆/缓存/ file.pdf, NSUnderlyingError = 0x20de1fe0“The 操作无法完成。坏 地址“}
路径存在且有效。我认为问题是返回的NSData只是一个围绕用malloc分配的数组的轻量级包装器,而writeToFile不知道如何处理它。有谁看到我做错了什么?
答案 0 :(得分:1)
当您致电realloc
时,您必须保存返回的指针,因为realloc
可能会分配新的缓冲区并将旧位置的内容复制到该新位置。之后,旧位置为free
d,因此无效。另一个malloc
电话可能会覆盖旧位置。
所以你需要这样做:
buffer = realloc(buffer, length);
答案 1 :(得分:0)
该代码没有任何意义。
显示用于填充缓冲区的代码
你有一个malloc(),为什么你在循环之后realloc()?这是浪费周期,如果目标是在输入数据太长的情况下扩展缓冲区,则无法按照书面形式工作。
您必须检查writeToFile:options:error:
的返回值,以了解是否存在错误;你不能直接检查错误。
另外,不要将类似的类别粘贴到现有类中。一般来说,它表明一个脆弱且分层不佳的架构。如果你选择这条路线,至少在你的方法前面添加一些独特的东西。
目前尚不清楚为什么会出现这种特殊错误。那道路似乎有点不稳定,你是如何产生它的呢?