私はグーグルでこれを検索しましたが、簡単な結果は得られませんでした。Appleのドキュメントから、次のことについて根本的な誤解があるようです。
アーカイブには、任意の複雑なオブジェクトグラフを保存できます。アーカイブは、グラフ内のすべてのオブジェクトのIDと、グラフ内の他のすべてのオブジェクトとのすべての関係を保持します。アーカイブされていない場合、再構築されたオブジェクトグラフは、いくつかの例外を除いて、元のオブジェクトグラフの正確なコピーである必要があります。
NSMutableArray
オブジェクトのコレクションであるがあると仮定しPerson
ます。各Person
オブジェクトはとを実装initWithCoder
しencodeWithCoder
ます。さらに、任意の与えられたオブジェクトPerson
は、NSMutableArray
のオブジェクト(同様にコーディング準拠)を持つことができますTask
。
私の理解では、アーカイブする方法があるため、コーディングプロトコルの実装に応じて、任意の深さのカスケードシリアル化がトリガーされます。したがって、私のView Controllerには、次のようなwillEnterBackground
機能があります。
data = [NSKeyedArchiver archivedDataWithRootObject:self.people];
// persist to NSUserDefaults
そして私はviewDidLoad
それをします:
// read from NSUserDefaults
self.people = [NSKeyedUnarchiver unarchiveObjectWithData:data];
これはすべて起こりますが、2つのことがあります。
- 配列に含まれるオブジェクトの
initWithCoder
とは呼び出されません。encodeWithCoder
people
- 当然のことながら、結果は
self.people
サイズ0のNSMutableArrayになります。驚くべきことに、アーカイブされていないデータの長さは252バイトで、ほぼ正しく見えます。
提案?ヒント?