Об исключении NSE от "NSKeyedUnarchiver unarchiveObjectWithFile:" - PullRequest
1 голос
/ 25 сентября 2011
NSArray *t_annos;

@try 
{
  NSLog(@" --- pointer before = %ld --- ", (long) t_annos);  
  t_annos 
     = [NSKeyedUnarchiver unarchiveObjectWithFile : d_path]; 
  NSLog(@" --- pointer after  = %ld --- ", (long) t_annos);
}
@catch (NSException *e) 
{
  NSLog(@" --- e caught  ---"); 
  t_annos = nil;     
}

Пожалуйста, обратите внимание на приведенные выше утверждения, ситуация такова:

1

Согласно документации, следует создать исключение, если d_path не указывает на действительный архив.Но исключение не выявляется, даже если d_path намеренно установлен с неверным путем.

2

Протестировал код как на симуляторе xcode, так и на тестовом устройстве (iphone).Хотя и симулятор, и устройство телефона не улавливают никаких исключений, телефон разархивирует массив, как и ожидалось, в то время как на симуляторе программа останавливается с выводом: «Программа получила сигнал:« EXC_BAD_ACCESS »» на консоли отладчика.

3

Ошибка «плохой доступ» должна была появиться в операторе «unarchiveObjectWithFile», так как программа останавливается после первого вывода NSLog.

4

При попытке заархивировать и разархивировать один объект NSString у симулятора и тестового устройства проблем нет.Но по-прежнему нет исключений, даже если путь неправильный.

Может быть, с моей стороны чего-то не хватает, надеюсь, что кто-то, кто знает, может помочь.

1 Ответ

4 голосов
/ 25 сентября 2011

Согласно документации, исключение выдается, только если по пути существует файл, а не архив, созданный NSKeyedArchiver.

unarchiveObjectWithFile:

Декодирует и возвращает граф объекта, ранее закодированный NSKeyedArchiver записывается в файл по заданному пути. + (id) unarchiveObjectWithFile: (NSString *) путь

Параметры: путь

Путь к файлу, который содержит граф объектов, ранее закодированный NSKeyedArchiver.

Возвращаемое значение

Граф объектов, ранее закодированный NSKeyedArchiver, записанный в Путь файла. Возвращает ноль, если в пути нет файла.

Обсуждение

Этот метод вызывает NSInvalidArgumentException, если файл находится по пути не содержит действительный архив.

Итак, для -

1: Скорее всего, заданный вами неверный путь не указывает ни на один файл, и, следовательно, возвращаемое значение равно nil без каких-либо исключений.

2: Вы гарантировали, что путь на симуляторе указывает на действительный файл, заархивированный NSKeyedArchiver ранее? Скорее всего, это указывает на какой-то другой файл.

4: то же самое, что и # 1.

НТН,

Акшай

...