NSData writeToFile writes Plist successfully, but then crashes, giving NSInvalidArgumentException

妖精的绣舞 提交于 2019-12-24 18:29:11

问题


I am converting a JSON file to a plist using the new NSJSONSerialization class and NSPropertyListSerialization class. I manage to convert my JSON to a Plist without errors, but then, at my last step, when I go to write the plist to my desktop, the program crashes, but AFTER the Plist has been generated!

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];

Then, at this last line, an NSInvalidArgumentException is thrown, and crashes my program. However, the plist was successfully generated! I can read it, and all is well, except my program crashes.

Could someone please explain why this crashes, and how I could avoid crashing?


回答1:


The problem seems to be that the variable plist is type id. Cast it to NSData and you should be fine.

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

As you correctly point out in the comment, NSData should use the writeToFile:atomically: method.



来源:https://stackoverflow.com/questions/9758885/nsdata-writetofile-writes-plist-successfully-but-then-crashes-giving-nsinvalid

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!