objective-c - 无法弄清楚如何保存文件

标签 objective-c ios nskeyedarchiver property-list

我试图将我的对象保存到 iPad 上的文件系统中,但我似乎做错了什么。这是我存档对象的方式:

NSString *localizedPath = [self getPlistFilePath];
NSString *fileName = [NSString stringWithFormat:@"%@.plist", character.infoName];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:character];

fileName = [fileName stringByReplacingOccurrencesOfString:@" " withString:@"_"];
localizedPath = [localizedPath stringByAppendingPathComponent:fileName];

NSLog(@"File Path: %@", localizedPath);

if(data) {
    NSError *writingError;

    BOOL wasWritten = [data writeToFile:localizedPath options:NSDataWritingAtomic error:&writingError];

    if(!wasWritten) {
        NSLog(@"%@", [writingError localizedDescription]);
    }
}

现在,这将创建一个我可以在文件系统上查看和读取的 plist 文件。但是,当我尝试使用以下方法取消存档时:

NSError *error;
NSString *directory = [self getPlistFilePath];
NSArray *files = [[NSFileManager defaultManager]contentsOfDirectoryAtPath:directory error:&error];
NSMutableArray *characters = [[NSMutableArray alloc]init];

for(NSString *path in files) {
    if(![path hasSuffix:@"plist"]) {
        continue;
    }
    NSString *fullPath = [directory stringByAppendingPathComponent:path];
    NSData *data = [NSData dataWithContentsOfFile:fullPath];
    IRSkillsObject *object = [NSKeyedUnarchiver unarchiveObjectWithData:data]; // get EXEC_BAD_ACCESS here...
    [data release];

    [characters addObject:object];
}

我收到 EXEC_BAD_ACCESS 错误。

IRSkillsObject 符合NSCoding 协议(protocol)。您可以看到,我对出现错误的行进行了注释。

我确信这是我做错了什么,但我就是看不到它。我试图通过调试器(在对象的 initWithCoder: 方法中放置一个断点)但是我没有收到任何错误。事实上,它在我观察时将数据正确地放置在对象中。但是一旦完成加载数据,就会出现错误。我尝试过使用 retain 方法,但这没有用。

如果您能提供任何帮助,我们将不胜感激!

最佳答案

您正在释放 data 而不分配它。

NSData *data = [NSData dataWithContentsOfFile:fullPath];
IRSkillsObject *object = [NSKeyedUnarchiver unarchiveObjectWithData:data];
[data release];

那么试试这个:

NSData *data = [[NSData alloc] initWithContentsOfFile:fullPath];
IRSkillsObject *object = [NSKeyedUnarchiver unarchiveObjectWithData:data];
[data release];    

关于objective-c - 无法弄清楚如何保存文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9302398/

相关文章:

iphone - 将pid_t转换为NSString

objective-c - 如何自定义 NSSlider

ios - iOS-编码/解码枚举-重新启动后在访问时崩溃

ios - 无法为键(NS.object.0)解码 Employee 类的对象;该类可能在源代码或未链接的库中定义

ios - CALayer 旋转显示为 'lift' 它是表面上方的子项

IOS 编辑器错误。 archivedData 重命名

javascript - React Native 模块向 JavaScript 文档发送事件是否正确?

objective-c - iOS9 WKWebview didReceiveAuthenticationChallenge 调用主机为空

objective-c - 是什么导致 iOS 中的 CBCentralManager State Unknown?

ios - swift中URLQueryItem的作用是什么?