我想将我的对象保存到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
方法,但这并没有帮助。
任何帮助,你可以提供将不胜感激!
就是这样。我对客观的c和内存管理还是一个新的东西(我的历史大部分是在.net中)。当我设置数据时(即'infoName = [coder decodeObjectForKey:kNameKey];')我设置了对象的iVar,然后释放该项目。当我把它变成self时[propertyname](即'self.infoName = [coder decodeObjectForKey:kNameKey];')它工作。 – 2012-02-16 16:56:01