0

我正在尝试将我的对象保存到 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协议。你可以看到,我评论了我得到错误的那一行。

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

您可以提供的任何帮助将不胜感激!

4

2 回答 2

3

您正在释放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];    
于 2012-02-15T22:35:19.077 回答
1

当发现 EXEC_BAD_ACCESS 错误时。通常是因为一些数据已经发布,但在代码中仍然需要它。

也许您的 IRSkillsObject 中有一个属性未保留在-initWithCoder:

于 2012-02-16T16:44:58.453 回答