为什么NSMutableDictionary不想写入文件?

时间:2012-01-03 14:35:06

标签: iphone ios nsmutabledictionary nsfilemanager

- (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);
        }
}

这是我的代码。我检查文件是否已创建 - 如果没有 - 我创建了一个NSMutableDictionary并将其写入路径中的文件,但writeToFile方法返回NO。哪里有问题?如果我使用NSFileManager创建此文件,它可以正常工作,但在我想编写字典时却不行。

2 个答案:

答案 0 :(得分:29)

writeToFile:atomically仅在您调用的字典是有效的属性列表对象(see docs)时才有效。

要使NSDictionary成为有效的属性列表对象,除其他外,还有keys must be strings,但在您的示例中,键是NSNumber个实例。

答案 1 :(得分:12)

您无法控制有时会写的内容。例如,当您要编写从服务器获取的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];