2012-02-15 111 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