NSData writeToFile成功写入Plist,但随后崩溃,产生NSInvalidArgumentException

时间:2012-03-18 14:00:04

标签: objective-c json serialization plist

我正在使用新的NSJSONSerialization类和NSPropertyListSerialization类将JSON文件转换为plist。我设法将我的JSON转换为Plist而没有错误,但是,在我的最后一步,当我将plist写入我的桌面时,程序崩溃,但是在Plist生成之后!

NSData *data = [[NSData alloc] initWithContentsOfURL:path]; \\(NSURL *)path -->goes to my JSON file
NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:data 
                                                            options:NSJSONReadingMutableContainers 
                                                              error:nil];

//the following removes all key/object pairs where the object is null, because NSPropertyListSerialization with throw an error if there are null values
for (id __strong object in [json objectForKey:@"terms"]) {
        if ([object objectForKey:@"image"] == [NSNull null]) {
            [object removeObjectForKey:@"image"];
        }
    }

 //the following NSPropertyListSerialization method returns an NSData
 id plist = [NSPropertyListSerialization dataFromPropertyList:(id)json 
                                                       format:NSPropertyListXMLFormat_v1_0 
                                             errorDescription:nil]; 


NSError *writeToFileError;
[plist writeToFile:@"/Users/kalaracey/Desktop/test.plist" 
        atomically:YES 
          encoding:NSUTF8StringEncoding 
             error:&writeToFileError];

然后,在最后一行,抛出NSInvalidArgumentException并崩溃我的程序。但是,plist成功生成了!我可以阅读它,一切都很好,除了我的程序崩溃。

有人可以解释为什么会崩溃,以及如何避免崩溃?

1 个答案:

答案 0 :(得分:2)

问题似乎是变量plist是类型id。把它投到NSData,你应该没问题。

NSData *plist = (NSData *) [NSPropertyListSerialization ...];

正如您在评论中正确指出的那样,NSData应使用writeToFile:atomically:方法。