У меня есть следующий код для чтения архивного массива:
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];
Вытащив лист из устройства, он выглядит очень странно (и очень пусто):
<?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 'empty'), а затем, чтобы вызов unarchiveObjectWithFile вызвал исключение так, как это происходит (что, согласно трассировке стека, находится внутри системной библиотеки).