NSKeyedUnarchiver unarchiveObjectWithData返回nil

时间:2015-10-05 09:21:02

标签: ios swift swift2 ios9 nskeyedarchiver

我有一个使用NSCoder / NSKeyedArchiverNSKeyedUnarchiver序列化和反序列化的课程。我有单元测试,旨在检查我处理序列化格式中的各种错误(这不是一个简单的存档,但包含存档)。

但是,自从我升级到Swift 2 / iOS 9后,测试显示出一些不寻常的行为。以前,无效归档的测试失败,因为反序列化无效归档引发了一个Objective-C异常,正如文档声明的那样,由于Swift无法捕获它们而导致程序崩溃。这很好,我打算在将来某个时候修复测试。

现在,测试通过了。当我提供随机或确定性垃圾时,我会从nil而不是异常接收unarchiveObjectWithData。我已经检查了此方法的文档,但没有列出任何行为更改。

坦率地说,我发现这种行为变得非常可疑,因为没有提到这种变化是如何或为何发生的。我以前失败的单元测试刚刚过去,没有明显的原因。

这是新的预期行为(它返回nil)吗?如果没有,我怎样才能得到实际的预期行为(Obj-C例外)而不是nil的无效档案?

1 个答案:

答案 0 :(得分:3)

Swift2 / iOS9在staticdiv中引入未记录的 throws类方法:

NSKeyedUnarchiver

但是如果数据格式完全错误,它似乎不起作用:它返回extension NSKeyedUnarchiver { @warn_unused_result public class func unarchiveTopLevelObjectWithData(data: NSData) throws -> AnyObject? } 而没有错误。

nil

只有当unarchiver在解码时发现一些无效实体(例如未知的类名)时才会抛出错误。我认为这是一种错误,或者它是在不完整的实现中意外发布的。

无论如何,如果你想要Objective-C异常,你可以构建let dat = "test".dataUsingEncoding(NSUTF8StringEncoding)! try! NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(dat) // -> `nil`

NSKeyedUnarchiver

但是,还没有let dat = "test".dataUsingEncoding(NSUTF8StringEncoding)! let unarchiver = NSKeyedUnarchiver(forReadingWithData: dat) // -> throws Objective-C exception 初始化程序......