Сбой в unarchiveObjectWithFile при определенных условиях - PullRequest
3 голосов
/ 28 декабря 2011

У меня есть следующий код для чтения архивного массива:

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 вызвал исключение так, как это происходит (что, согласно трассировке стека, находится внутри системной библиотеки).

1 Ответ

0 голосов
/ 28 декабря 2011

вам захочется что-то более подобное десериализовать лист

NSArray * someArray = [NSPropertyListSerialization dataFromPropertyList: [NSData dataWithContentsOfFile:path] format:NSPropertyListXMLFormat_v1_0 errorDescription:nil];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...