iphone - 日本 - 初めての ios アプリケーション




iPhone SDKでシンプルなオブジェクトをシリアル化するにはどうすればよいですか? (2)

私はオブジェクトの辞書を持っています。 それらはすべてシリアライズ可能なPOCOオブジェクトです。 これらをディスクに書き込むためには、どのような手法を検討する必要がありますか。 私は状態を保存するためのいくつかのリストを書くための最も簡単なオプションを探しています。

私は3つの選択肢があると思う。

  1. plistファイル。 しかし、これはあらかじめ定義されたオブジェクト(文字列、数字など)をオブジェクト(名前と年齢の人のようなもの)として保存することに限られているようです。

  2. CoreData。 (3.0の新機能)これはうまくいくでしょう。 私のデータモデルはこの作業をするために変更する必要があります。 これは大規模なリワークであり、努力する価値があるかどうかはわかりません。

  3. SQLLite。 簡単なSQLデータベースを実装して読み書きを行います。 私はこれに最小限のリサーチをしましたが、ORMの中核機能の一部を「書き直す」必要はありません。


NSCoderは、 NSCoder化の標準的なココアのイディオムです。


カスタムオブジェクトをシリアル化するには、 NSCodingプロトコルに準拠するだけです。 あなたのオブジェクトがNSObjectを拡張している場合は、これらを実装するだけです(人物オブジェクトの例):

// Encode an object for an archive
- (void)encodeWithCoder:(NSCoder *)coder
{
    [super encodeWithCoder:coder];
    [coder encodeObject:name forKey:@“Name”];
    [coder encodeInteger:age forKey:@“Age”];
}
// Decode an object from an archive
- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    name = [[coder decodeObjectForKey:@“Name”] retain];
    age  = [coder decodeIntegerForKey:@“Age”];
}

NSArrayNSDictionaryすでにシリアライズのためのメソッドを実装しています。 彼らはそれらが保持しているすべてのオブジェクトを直列化します(オブジェクトがNSCoderインタフェースを実装する場合、それらはNSObjectを拡張する場合に実行されます)。 NSObjectのencodeWithCoderinitWithCoderはデフォルトで何もしません。クラスに独自のコードを実装しない限り、何もシリアル化されません。

オブジェクトのNSArrayまたはNSDictionaryを使用している場合は、以下を使用してそれらを同期できます。

// Writing
- (BOOL)writeToFile:(NSString *)aPath atomically:(BOOL)flag;
- (BOOL)writeToURL:(NSURL *)aURL atomically:(BOOL)flag;
// Reading
- (id)initWithContentsOfFile:(NSString *)aPath;
- (id)initWithContentsOfURL:(NSURL *)aURL;






cocoa-design-patterns