为什么NSMutableDictionary不想写入文件?

- (void)viewDidLoad { [super viewDidLoad]; if ([[NSFileManager defaultManager] fileExistsAtPath:pathString]) { infoDict = [[NSMutableDictionary alloc] initWithContentsOfFile:pathString]; } else { infoDict = [[NSMutableDictionary alloc]initWithObjects:[NSArray arrayWithObjects:@"BeginFrame",@"EndFrame", nil] forKeys:[NSArray arrayWithObjects:[NSNumber numberWithBool:YES],[NSNumber numberWithBool:YES], nil]]; if ([infoDict writeToFile:pathString atomically:YES]) { NSLog(@"Created"); } else { NSLog(@"Is not created"); NSLog(@"Path %@",pathString); } } 

这是我的代码。 我检查是否创build文件,如果没有 – 我创build一个NSMutableDictionary并将其写入文件的path,但writeToFile方法返回NO 。 问题在哪里? 如果我使用NSFileManager创build这个文件,它可以工作,但是当我想写一个字典时不会。

writeToFile:atomically只有当你调用它的字典是一个有效的属性列表对象时,它才会工作( 请参阅文档 )。

对于一个NSDictionary是一个有效的属性列表对象,除此之外,它的键必须是string ,但在你的例子中,键是NSNumber实例。

你无法控制你有时要写的内容。 例如,当您要编写从服务器获取的JSON对象时,您无法避免使用null值。

NSData与这些“无效”值兼容,所以在这种情况下将NSArrayNSDictionary转换为NSData是一种理想的方法。

写:

 NSData *data = [NSKeyedArchiver archivedDataWithRootObject:jsonObject]; [data writeToFile:path atomically:YES]; 

读:

 NSData *data = [NSData dataWithContentsOfFile:path]; NSDictionary *jsonObject = [NSKeyedUnarchiver unarchiveObjectWithData:data];