У меня есть следующий код, чтобы прочитать архивную массив:Сбой в 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 вызывает исключение так, как он делает (что по трассе стека находится внутри системной библиотеки).
NaH, что часть кода еще даже не была достигнута - как я сказал, было сгенерировано исключение * внутри * на unarchiveObjectWithFile вызов. –
О, да, это неправильно, вы не должны использовать ключ-архиватор для десериализации plist ... редактирование –
Архивы/unarchive верны, так как я использую безопасные объекты списка свойств, которые поддерживают NSCoding. Вопросы не «как это сделать», как я это делал много раз. Корень вопроса заключается в том, как закодированные данные настолько запутались, что вызвали сбой unarchiveObjectWithFile. Я отправил отчет об ошибке с apple теперь, включая файл, который вызвал его сбой. –