Iphone 关于“NSKeyedUnarchiveObjectWithFile:中的NSException” 请考虑上述陈述,情况是:

Iphone 关于“NSKeyedUnarchiveObjectWithFile:中的NSException” 请考虑上述陈述,情况是:,iphone,nskeyedarchiver,Iphone,Nskeyedarchiver,一, 根据文档,如果d_路径未指向有效存档,则应引发异常。但即使故意将d_路径设置为无效路径,也不会捕获任何异常 二, 我们已经在xcode模拟器和测试设备iphone上测试了代码。尽管模拟器和手机设备均未捕获任何异常,但手机会按预期解除阵列归档,而在模拟器上,程序会在调试器控制台上以输出:程序接收信号:EXC_BAD_访问停止 三, 错误的访问错误应该出现在unarchiveObjectWithFile语句中,因为程序在第一次NSLog输出后停止 四, 当尝试使用单个NSString对象归档和

一,

根据文档,如果d_路径未指向有效存档,则应引发异常。但即使故意将d_路径设置为无效路径,也不会捕获任何异常

二,

我们已经在xcode模拟器和测试设备iphone上测试了代码。尽管模拟器和手机设备均未捕获任何异常,但手机会按预期解除阵列归档,而在模拟器上,程序会在调试器控制台上以输出:程序接收信号:EXC_BAD_访问停止

三,

错误的访问错误应该出现在unarchiveObjectWithFile语句中,因为程序在第一次NSLog输出后停止

四,

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


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

根据文档,只有当路径上存在文件且不是由NSKeyedArchiver创建的存档文件时,才会引发异常

unarchiveObjectWithFile:

解码并返回以前由编码的对象图 NSKeyedArchiver以给定路径写入文件。 +idunarchiveObjectWithFile:NSString*路径

参数:路径

包含以前由编码的对象图的文件的路径 NSKeyedArchiver

返回值

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

讨论

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

那么,为了-

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

2:您是否已确保模拟器上的路径指向先前由NSKeyedArchiver存档的有效文件?最有可能的是,它指向另一个文件


4:与1相同。

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

unarchiveObjectWithFile:

解码并返回以前由编码的对象图 NSKeyedArchiver以给定路径写入文件。 +idunarchiveObjectWithFile:NSString*路径

参数:路径

包含以前由编码的对象图的文件的路径 NSKeyedArchiver

返回值

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

讨论

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

那么,为了-

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

2:您是否已确保模拟器上的路径指向先前由NSKeyedArchiver存档的有效文件?最有可能的是,它指向另一个文件


4:与1相同。

请在标题上多加创意。我们知道这已经是一个问题了。标题已编辑,感谢您指出…您的数组中有哪些对象?数组中的任何自定义类?对象都来自符合NSCoding的自定义类。所以他们认为这些物体应该没问题。@mja,你说得对。我应该更深入地研究数组中的对象。在定义对象的类时发生了一个小错误。不知何故,测试手机没有受到影响,但模拟器只是在编码错误时停止。问题已经解决,一切正常。请在标题上多加创意。我们知道这已经是一个问题了。标题已编辑,感谢您指出…您的数组中有哪些对象?数组中的任何自定义类?对象都来自符合NSCoding的自定义类。所以他们认为这些物体应该没问题。@mja,你说得对。我应该更深入地研究数组中的对象。在定义对象的类时发生了一个小错误。不知何故,测试手机没有受到影响,但模拟器只是在编码错误时停止。问题解决了,一切都很好。我想你大概是对的。至于2,我认为你也可能是对的,但还没有找到一个好的方法来验证它,谢谢…我认为你关于1是对的。至于2,我认为你也可能是对的,但还没有找到一个好方法来验证它,谢谢。。。
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;     
}