2012-02-15 154 views
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方法,但这并没有帮助。

任何帮助,你可以提供将不胜感激!

回答

1

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

也许有您的IRSkillsObject内的属性不保留在-initWithCoder:

+0

就是这样。我对客观的c和内存管理还是一个新的东西(我的历史大部分是在.net中)。当我设置数据时(即'infoName = [coder decodeObjectForKey:kNameKey];')我设置了对象的iVar,然后释放该项目。当我把它变成self时[propertyname](即'self.infoName = [coder decodeObjectForKey:kNameKey];')它工作。 – 2012-02-16 16:56:01

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];  
+2

或删除线[数据释放]; – 0xDE4E15B 2012-02-15 22:45:29

+0

好的,也许这不是导致问题的上述方法。如果我用'[[NSData alloc] initWithContentsOfFile:fullPath]替换'[NSData datawithContentsOfFile:fullPath];'''它做同样的事情。我的物体能有什么东西吗? 谢谢 – 2012-02-15 23:39:46

+0

在同一文件夹中是否还有其他plist文件?如果是,请全部删除并尝试再次归档/取消归档。 – iDifferent 2012-02-16 00:10:10