gpt4 book ai didi

ios - NSKeyedUnarchiver unarchiveObjectWithData 返回零

转载 作者:搜寻专家 更新时间:2023-10-30 22:15:15 24 4
gpt4 key购买 nike

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

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

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

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

那么这是新的预期行为吗(它返回 nil)?如果不是,我如何才能获得实际的预期行为(Obj-C 异常)而不是无效存档的 nil

最佳答案

Swift2/iOS9 在 NSKeyedUnarchiver 中引入了未记录 throws 类方法:

extension NSKeyedUnarchiver {
@warn_unused_result
public class func unarchiveTopLevelObjectWithData(data: NSData) throws -> AnyObject?
}

但如果数据格式完全错误,它似乎不起作用:它返回 nil 没有错误。

let dat = "test".dataUsingEncoding(NSUTF8StringEncoding)!
try! NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(dat) // -> `nil`

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

无论如何,如果你想要 Objective-C 异常,你可以构造 NSKeyedUnarchiver:

let dat = "test".dataUsingEncoding(NSUTF8StringEncoding)!
let unarchiver = NSKeyedUnarchiver(forReadingWithData: dat) // -> throws Objective-C exception

但是,还没有throws 初始化器……吗?

关于ios - NSKeyedUnarchiver unarchiveObjectWithData 返回零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32945068/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com