2013-01-14 38 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

这对我保存数据时,虽然你会如何加载数据从此工作?提前致谢。 –