2013-01-14 45 views
2

我花了幾個小時試圖弄清楚這一點,但我已經用盡了想法。NSKeyedArchiver archiveRootObject不斷返回否

所有我想要做的是歸檔的對象,但在返回NO

archiveRootObject保持方法,這裏是我的代碼:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
NSString *cacheDirectory = [paths objectAtIndex:0]; 
cacheDirectory = [cacheDirectory stringByAppendingPathComponent:@"MyAppCache"]; 
NSString *fullPath = [cacheDirectory stringByAppendingPathComponent:@"archive.data"]; 

if(![[NSFileManager defaultManager] fileExistsAtPath:fullPath]){ 
    [[NSFileManager defaultManager] createDirectoryAtPath:fullPath withIntermediateDirectories:YES attributes:nil error:nil]; 
} 

NSArray *array = [NSArray arrayWithObjects:@"hello", @"world", nil]; 
NSLog(@"Full Path: %@", fullPath); 
BOOL res = [NSKeyedArchiver archiveRootObject:array toFile:fullPath]; 

if(res){ 
    NSLog(@"YES"); 
}else{ 
    NSLog(@"NO"); 
} 

每次時間我運行此,它打印NO

任何幫助,將不勝感激!

回答

6

您創建一個路徑爲fullPath的目錄,然後嘗試將文件寫入相同的路徑。用這樣的文件覆蓋目錄是不可能的。使用您的cacheDirectory字符串創建您的目錄。

+0

差不多拉了我的頭髮。謝謝你斯文! – Khon

1

NSString * cacheDirectory不是一個可變字符串,並且在初始化它之後,您將嘗試對其進行修改,以便您正在寫入頂層目錄。

快速修復,嘗試:

NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
NSString *documentPath = ([documentPaths count] > 0) ? [documentPaths objectAtIndex:0] : nil; 
NSString *documentsResourcesPath = [documentPath stringByAppendingPathComponent:@"MyAppCache"]; 

NSString *fullPath = [documentsResourcesPath stringByAppendingPathComponent:@"archive.data"]; 
+1

感謝您的建議吉姆,我嘗試了您的建議,但沒有奏效。結果Sven發現了這個錯誤。我的代碼試圖用文件覆蓋一個目錄。 – Khon

+0

那麼,我的代碼工作,但我忽略了更改創建目錄代碼以使用正確的iVAR。 if(![[NSFileManager defaultManager] fileExistsAtPath:fullPath]){[NSFileManager defaultManager] createDirectoryAtPath:documentsResourcesPath withIntermediateDirectories:YES attributes:nil error:nil];祝你好運和最好的問候,吉姆 – JimP

+0

這對我保存數據時,雖然你會如何加載數據從此工作?提前致謝。 –