NSData writeToFile успешно пишет Plist, но затем вылетает, давая NSInvalidArgumentException - PullRequest
1 голос
/ 18 марта 2012

Я конвертирую файл JSON в plist, используя новый класс NSJSONSerialization и класс NSPropertyListSerialization. Мне удается без ошибок преобразовать 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 и происходит сбой моей программы. Тем не менее, список был успешно создан! Я могу прочитать это, и все хорошо, кроме моей программы, вылетает.

Может кто-нибудь объяснить, почему это происходит, и как я могу избежать этого?

1 Ответ

2 голосов
/ 18 марта 2012

Кажется, проблема в том, что переменная plist имеет тип id. Приведите его к NSData и все будет хорошо.

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

Как вы правильно указали в комментарии, NSData должен использовать метод writeToFile:atomically:.

...