2009-04-30 14 views
8

私は上記の状態で質問しましたが、「OK、これにはencodeWithCoder:initWithCoder:のインスタンスが必要です」と言うためにどのような要件を満たす必要がありますか?通常、オブジェクトの状態をNSUserDefaultsに書き込むことができます。そのため、専門家はいつ別のものを使うのだろうと思いますか?iPhoneではいつencodeWithCoder:とinitWithCoder:を使用しますか?

答えて

9

ユーザーデフォルトは基本的にプロパティリストです。プロパティリストはJSONと似ており、特定のタイプのデータ(NSString、NSNumber、NSData、NSDate、NSArray、NSDictionary)のみを格納できます。ユーザーのデフォルトに他のものを格納しようとすると、例外が発生します。プロパティリストは任意のオブジェクトグラフ、ツリーのみを扱うこともできません。

いつでもあなたのカスタム状態を取得し、それをプロパティーリスト互換データ構造に変換して、それをユーザーのデフォルト値に格納することができます。しかし、基本的にはオブジェクトの直列化の仕組みを実装しているので、NSArchiverがすでに提供しているより強力なものを使うこともできます。

10

initWithCoder:は、XIBファイルのアンアーカイブ時にOSによって使用されます。詳しく見ると、XIBで作成したビューに対してinitWithFrame:が呼び出されないことがわかります。代わりにinitWithCoder:が呼び出されます。

+0

こんにちはベン、私はXIBを使用しているときこのメソッドなしでうまくいく。私がプログラムで構築したビューについては、通常はloadViewだけでうまくいきます。 IBで構築したビューについては、私はviewDidLoad {}を使用します。ですから、私はinitWithCoderを使うのが当然のことを理解しようとしています: – Coocoo4Cocoa

1

私は手で編集する必要がないことを記憶するために何らかの複雑なデータがあるときはいつでも、NSCoderを使います。たとえば、私のアプリConverterは、インターネットからダウンロードした為替レートをNSCoderアーカイブに保存します。しかし、それはそのようなアーカイブに残っている唯一のものです。手作業で変更されるユニット定義は、アプリケーションバンドル内の一連のplistファイルに保存され、最近選択されたユニットや値などが保持されますNSUserDefaults。

関連する問題