簡體   English   中英

NSKeyedUnarchiver unarchiveObjectWithData返回nil

[英]NSKeyedUnarchiver unarchiveObjectWithData returning nil

我有一個使用NSCoder / NSKeyedArchiverNSKeyedUnarchiver進行序列化和反序列化的類。 我有單元測試,旨在檢查我處理序列化格式中的各種錯誤(這不是一個簡單的存檔,但包含存檔)。

但是,自從我升級到Swift 2 / iOS 9后,測試顯示出一些不尋常的行為。 以前,無效歸檔的測試失敗,因為反序列化無效歸檔引發了一個Objective-C異常,正如文檔聲明的那樣,由於Swift無法捕獲它們而導致程序崩潰。 這很好,我打算在將來的某個時候修復測試。

現在,測試通過。 當我輸入隨機或確定性垃圾時,我會從unarchiveObjectWithData接收nil而不是異常。 我已經檢查了這個方法的文檔,並且沒有列出任何行為更改。

坦率地說,我發現這種行為變得非常可疑,因為沒有提到這種變化是如何或為何發生的。 我之前失敗的單元測試剛剛過去,沒有明顯的原因。

這是新的預期行為(它返回nil )? 如果沒有,我怎樣才能獲得實際的預期行為(Obj-C異常)而不是無效存檔的nil

Swift2 / iOS9介紹無證 throws在類方法NSKeyedUnarchiver

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

但是,如果數據格式完全錯誤,它似乎不起作用:它返回nil而沒有錯誤。

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

僅當unarchiver在解碼時發現一些無效實體(例如未知類名)時才會拋出錯誤。 我認為這是一種錯誤,或者它是在不完整的實現中意外發布的。

無論如何,如果你想要Objective-C異常,你可以構造NSKeyedUnarchiver

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

但是,沒有throws初始化器......但是?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM