关于来自“NSKeyedUnarchiver unarchiveObjectWithFile:”的NSException

时间:2011-09-25 08:15:58

标签: iphone nskeyedarchiver

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

“bad access”错误应该出现在“unarchiveObjectWithFile”语句中,因为程序在第一个NSLog输出后停止。

4

尝试使用归档和取消归档的单个NSString对象时,模拟器和测试设备都没有问题。但即使路径错误,仍然没有例外。

我可能缺少一些东西,希望有知识的人可以提供帮助。

1 个答案:

答案 0 :(得分:4)

根据文档,仅当路径中存在文件且不是NSKeyedArchiver创建的存档时才会引发异常。

  

unarchiveObjectWithFile:

     

解码并返回先前编码的对象图   NSKeyedArchiver在给定路径上写入文件。   +(id)unarchiveObjectWithFile:(NSString *)path

     

参数:路径

     

包含先前由其编码的对象图的文件的路径   的NSKeyedArchiver。

     

返回值

     

以前由NSKeyedArchiver编写的对象图写入   文件路径。如果路径中没有文件,则返回nil。

     

讨论

     

如果文件位于路径,则此方法引发NSInvalidArgumentException   不包含有效的存档。

所以,对于 -

1:您设置的无效路径很可能不指向任何文件,因此返回值为nil而没有任何异常。

2:您是否确保模拟器上的路径指向NSKeyedArchiver之前存档的有效文件?最有可能的是,它指向其他文件。

4:与#1相同。

HTH,

阿克沙伊