gpt4 book ai didi

iphone - NSData 的 dataWithBytesNoCopy 和 writeToFile

转载 作者:行者123 更新时间:2023-11-29 05:02:53 26 4
gpt4 key购买 nike

我有一个类别方法,可以执行如下操作:

@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];

我收到错误:

Error Domain=NSCocoaErrorDomain Code=512 "The operation couldn’t be completed. (Cocoa error 512.)" UserInfo=0x20deffd0 {NSFilePath=/Users/user/Library/Application Support/iPhone Simulator/4.3/Applications/4C315580-153D-4FA7-9474-E17B58832515/Library/Caches/file.pdf, NSUnderlyingError=0x20de1fe0 "The operation couldn’t be completed. Bad address"}

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

最佳答案

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

所以你需要这样做:

buffer = realloc(buffer, length);

关于iphone - NSData 的 dataWithBytesNoCopy 和 writeToFile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6457836/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com