1

私はグーグルでこれを検索しましたが、簡単な結果は得られませんでした。Appleのドキュメントから、次のことについて根本的な誤解があるようです。

アーカイブには、任意の複雑なオブジェクトグラフを保存できます。アーカイブは、グラフ内のすべてのオブジェクトのIDと、グラフ内の他のすべてのオブジェクトとのすべての関係を保持します。アーカイブされていない場合、再構築されたオブジェクトグラフは、いくつかの例外を除いて、元のオブジェクトグラフの正確なコピーである必要があります。

NSMutableArrayオブジェクトのコレクションであるがあると仮定しPersonます。各Personオブジェクトはとを実装initWithCoderencodeWithCoderます。さらに、任意の与えられたオブジェクトPersonは、NSMutableArrayのオブジェクト(同様にコーディング準拠)を持つことができますTask

私の理解では、アーカイブする方法があるため、コーディングプロトコルの実装に応じて、任意の深さのカスケードシリアル化がトリガーされます。したがって、私のView Controllerには、次のようなwillEnterBackground機能があります。

data = [NSKeyedArchiver archivedDataWithRootObject:self.people];
// persist to NSUserDefaults

そして私はviewDidLoadそれをします:

// read from NSUserDefaults
self.people = [NSKeyedUnarchiver unarchiveObjectWithData:data];

これはすべて起こりますが、2つのことがあります。

  1. 配列に含まれるオブジェクトのinitWithCoderとは呼び出されません。encodeWithCoderpeople
  2. 当然のことながら、結果はself.peopleサイズ0のNSMutableArrayになります。驚くべきことに、アーカイブされていないデータの長さは252バイトで、ほぼ正しく見えます。

提案?ヒント?

4

1 に答える 1

2

これら 2 つのメソッドを実装したとしても、Person クラスをプロトコルで宣言しましたか?

于 2012-07-31T18:52:41.727 に答える