2

NSMutableArray *recordsArray があり、キーは NSStrings で、値はカスタム オブジェクトです。

@interface DictRecord : NSObject{
}
@property (nonatomic, retain) NSString* word; 
@property (nonatomic, retain)  NSString  *wordStatus;

Cocoa: カスタム オブジェクトを含む NSMutableArray を保存/アーカイブする方法

その NSMutable 配列を、できれば非バイナリ (ある程度読み取り可能な) 形式で保存したいと考えています。

私はドキュメントを読み、エンコーディングメソッドを DictRecord に追加しました:

- (void) encodeWithCoder: (NSCoder *)coder
{
    [coder encodeObject: _word forKey:@"word" ];
    [coder encodeObject: _wordStatus forKey:@"wordStatus" ];
}
- (id) initWithCoder: (NSCoder *) coder
{
    self = [super init];
    if (self) {
        self.word = [coder decodeObjectForKey:@"word"];
        self.wordStatus = [coder decodeObjectForKey:@"wordStatus"];
}

次に、次を使用して保存しようとします:

[recordsArray writeToFile:filePath atomically:YES];

ファイルは保存されていますが、空であることがわかります。

どの手順を省略したか、または間違った方法で行ったかどうかを誰かに教えてもらえますか。

ありがとう

4

2 に答える 2

5

少しややこしいですが、NSCoding と NSArray および NSDictionary プロパティ リスト メソッドは 2 つの別個のものです。

次の 2 つの選択肢があります。

  1. NSコーディングを使用します。これは、配列の内容に対して呼び出されるコーディング メソッドを正しく取得する方法を示す回答です。
  2. を使用し-[NSArray writeToFile:atomically:]ます。と を実装する代わりに、独自の 2 つのメソッド-initWithCoder:とを作成します。書き込むには、モデル オブジェクトの配列を反復処理し、辞書の新しい配列を作成して、それを呼び出します。読み取るには、NSArray 読み取りメソッドの 1 つを呼び出し、それに含まれる辞書を取得して、それぞれを呼び出します。-decodeWithCoder-dictionaryValue-initWithDictionary:-writeToFile:atomically:-initWithDictionary:

人間が読める plist が必要な場合は、2 番目のオプションが適しています。

于 2013-02-12T16:14:53.647 に答える
1

-[NSArray writeToFile:atomically:] ドキュメントの状態

このメソッドは、ファイルを書き出す前に、含まれているすべてのオブジェクトがプロパティ リスト オブジェクトであることを再帰的に検証し、すべてのオブジェクトがプロパティ リスト オブジェクトでない場合は NO を返します。

プロパティ リスト ファイルを作成し、NSCoder を呼び出す場合は、NSKeyedArchiver/NSKeyedUnarchiver を使用する必要があります。

于 2013-02-12T16:15:50.200 に答える