2011-12-27 8 views
3

У меня есть следующий код, чтобы прочитать архивную массив:Сбой в unarchiveObjectWithFile при определенных условиях

id temp = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 
if(temp && [temp isKindOfClass:[NSArray class]]) 
{ 
    self.posts  = [temp mutableCopy]; 
} 

следующий код, чтобы сохранить массив со

-(void)savePostList 
{ 
    NSURL *tempURL = [[[ZZAppDelegate sharedAppDelegate] applicationCacheDirectory] URLByAppendingPathComponent:@"postCache.plist"]; 
    [NSKeyedArchiver archiveRootObject:self.posts 
           toFile:[tempURL path]]; 
} 

Вообще все работает отлично, однако в очень конкретные (в настоящее время неопределенные) обстоятельства, при которых приложение запускается сбой при запуске с исключением:

-[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0x275900 

авария на самом деле происходит внутри вызова:

id temp = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 

вытащив PLIST из устройства он выглядит очень странно (и очень пусто):

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<array/> 
</plist> 

Если я обернуть все это в пункте @try/@catch тогда «все в порядке», как так:

 @try { 
      id temp = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 
      if(temp && [temp isKindOfClass:[NSArray class]]) 
      { 
       self.posts  = [temp mutableCopy]; 
       if(self.posts) 
       { 
        [self precacheImages]; 
       } 
      } 
     } 
     @catch (NSException *exception) { 
      // exception thrown - delete file 
      NSLog(@"An exception occurred reading file - deleting"); 
      NSError * err; 

      if(![[NSFileManager defaultManager] removeItemAtPath:path error:&err]) 
      { 
       NSLog(@"Error deleting file: %@", err); 
      } 
     } 

Мой вопрос: есть ли какие-либо идеи, что бы привести к этому (как и в .plist является «пустой»), а затем для вызов unarchiveObjectWithFile вызывает исключение так, как он делает (что по трассе стека находится внутри системной библиотеки).

ответ

0

вы хотите что-то более, как это десериализации Plist

NSArray * someArray = [NSPropertyListSerialization dataFromPropertyList: [NSData dataWithContentsOfFile:path] format:NSPropertyListXMLFormat_v1_0 errorDescription:nil]; 
+0

NaH, что часть кода еще даже не была достигнута - как я сказал, было сгенерировано исключение * внутри * на unarchiveObjectWithFile вызов. –

+0

О, да, это неправильно, вы не должны использовать ключ-архиватор для десериализации plist ... редактирование –

+0

Архивы/unarchive верны, так как я использую безопасные объекты списка свойств, которые поддерживают NSCoding. Вопросы не «как это сделать», как я это делал много раз. Корень вопроса заключается в том, как закодированные данные настолько запутались, что вызвали сбой unarchiveObjectWithFile. Я отправил отчет об ошибке с apple теперь, включая файл, который вызвал его сбой. –

Смежные вопросы