2017-11-03 5 views
2

我々は[NSKeyedArchiver archivedDataWithRootObject:mockObject]を使用してモックオブジェクトをエンコードしようとすると、Xcode9にアップグレードした後、我々はクラッシュ/警告(警告のように見えますが、クラッシュのように振る舞う)を取得:NSKeyedArchiver archivedDataWithRootObjectの "mangled runtime name"クラッシュ/警告を無効にできますか?

Attempting to archive Swift class 'Foo.MockUser' with mangled runtime 
name '_TtCC13Foo27Bar8MockUser'. The runtime name for this class is 
unstable and may change in the future, leading to non-decodable data. 

は、任意の無効にする方法や仕事がありますこの周り?

+0

このリンクを確認しましたか?https://stackoverflow.com/questions/45751848/how-to-save-a-generic-custom-object-to-userdefaults? – trungduc

答えて

1

警告はスイフトを指しているので、あなたのモックはスウィフトに書かれていると思います。 その場合、警告が示すように@objc属性に名前を付けて属性を追加する必要があります。これは(すなわち、それはすでに発表され、アプリのアップデートではありません)あなたのアプリケーションの最初のバージョンである場合、それはこのような単なる接頭辞名前にすることができ

@objc(ABCDEFMockUser)class MockUser: NSObject, NSCoding { 
    ... 
} 

*ノート「ABCDEF」というここにあなたが望むものはありますが、 "MockUser"はあなたのクラス名と一致しなければなりません。

しかし、あなたのアプリのライブバージョンがすでにワイルドにあり、更新後にクラッシュすることを望まない場合は、そこに特別な名前が必要です。この名前は、Xcodeの警告自体に書かれています。あなたのケースでは、次のとおりです。

@objc(_TtCC13Foo27Bar8MockUser)class MockUser: NSObject, NSCoding { 
    ... 
} 

実は最も簡単な方法は、ちょうど黄色の警告記号をクリックして、「...既存のアーカイブの使用との互換性のため」と言って、非常に最初のXcodeの提案で「修正」打つことです。それでおしまい。

+0

「実際に最も簡単な方法は、黄色の警告記号をクリックすることです。問題は、赤色のエラーでこれが表示されていたことです。私はこれが警告に過ぎないことに同意するが、クラッシュのように振舞う。私はXcode 9.1以降でこれをまだテストしていません。新しいバージョンで修正されたらうれしいことです。 – mattliu

+0

@mattliuはあなたのアーカイブコードがObj-Cにあるからでしょうか?私の場合、私はアーカイブ/アーカイブ解除を行うコードとオブジェクト自体をSwiftに入れました。 – Vitalii

関連する問題