2015-10-05 9 views
6

私はNSCoder/NSKeyedArchiverNSKeyedUnarchiverでシリアル化して逆シリアル化するクラスを持っています。私はシリアライズ形式(単純なアーカイブではなくアーカイブを含む)内のさまざまなエラーの処理をチェックするように設計された単体テストを持っています。NSKeyedUnarchiver unarchiveObjectWithData nilを返す

しかし、Swift 2/iOS 9にアップグレードして以来、テストでは異常な動作が表示されています。以前は無効なアーカイブのデシリアライズに失敗したため、無効なアーカイブをデシリアライズすると、Swiftがそれらをキャッチできないため、プログラムをクラッシュさせたObjective-C例外がドキュメント状態としてスローされました。これは問題ありませんが、私は将来、ある時点でテストを修正しようとしていました。

今、テストに合格します。私のランダムまたは決定論的なごみを与えられたとき、私は代わりにunarchiveObjectWithDataからnilを受け取りました。私はこの方法のためにドキュメントをチェックしており、挙動の変更はリストされていません。

この変更は、この変更がどのように発生したのか、なぜこのような変更が発生したのかについての言及がないため、非常に疑わしいものです。私の以前失敗した単体テストは今や明らかな理由がなくなっています。

これは新しい予想される動作(nilを返す)ですか?そうでない場合は、どのように無効なアーカイブのnilではなく、実際に予想される動作(Obj-C例外)を取得できますか?

答えて

3

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` 

復号化中にunarchiverが無効なエンティティ(たとえば、不明なクラス名など)を検出した場合にのみ、エラーがスローされます。私はそれが一種のバグだと思います。あるいは、不完全な実装で誤ってリリースされていると思います。まだ...

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

をしかし、何throws初期化子がない:

とにかくあなたはObjective-Cの例外をしたい場合は、あなただけのNSKeyedUnarchiverを構築することができますか?

+0

ありがとうございます。私はNSKeyedArchiverを構築し、ObjC例外を手動で処理すると思いますので、この奇妙な文書化されていない半実装ステップにはありません。 – Puppy

関連する問題