コメント

　書籍には掲載していない、オブジェクトのアーカイブ、アンアーカイブの例題プログラムです。

　ここでは双方向リスト(two-way list または doubly linked list) を例としています。このリストは後ろの要素だけではなく、手前の要素を指すポインタも持ちます。プログラムでは前へのポインタは特に使っていませんが、リスト内を前後に移動するような用途に向いています。
　このクラスはプロトコル NSCopying と NSCoding を採用しています。インタフェース部では宣言されていませんが、これらのプロトコルのメソッドも実装しなければなりません。
　各インスタンスは前と後の要素を指すために２つのポインタを持っていますが、next だけを保持し、prev は参照だけ（弱い参照）とします。
　このクラスが構成するリストでは、各インスタンスは整数値の小さい順に並びます。まず、最初の要素はメソッド initWithIntValue: によって生成します。次に、このオブジェクトに対してメソッド addNewValue: を適用することで新しい整数を追加します。引数 val が追加したい整数です。val がその要素の値 value より小さい場合にはその位置に追加しますが、そうでない場合、次の要素 next が空でなければその要素に任せ、next が空ならリストの末尾なので新しい要素を追加します。リストの途中に追加する方法はメソッド定義を見て下さい。ただし、ここの目的はアルゴリズムの研究ではありませんので、ポインタ操作が苦手な方はこのあたりは深く追求して頂かなくて結構です。
　アーカイブのためのメソッド encodeWithCoder: では、オーナーシップを伴わない prev のエンコードに encodeConditionalObject: を使っていますが、この場合は encodeObject: でも構いません。
　クラス NSFileManager を使ってファイルに関する操作を行うことができます。ここでは変数 ArchivePath で指定した "save.dat" というファイルの有無を調べています。プログラムでは、カレントディレクトリにこのファイルがあればそのファイルからデータを読み込み、アンアーカイブして変数 list をルートオブジェクトにします。ファイルがなければ端末から読み込んだ整数をひとつ持つリストを作成します。
　ループの中では、整数を読み込んでリストに追加し、リストの内容を先頭から表示します。EOF入力(Ctrl-D)があったらループから抜けて、その時の list をルートオブジェクトとしてアーカイブし、結果を "save.dat" に書き出します。

実行例は次のようになります。

% ./twoway
32
 32
78
 32 78
11
 11 32 78
144
 11 32 78 144		# ここで Ctrl-D を入力
dealloc: 11
dealloc: 32
dealloc: 78
dealloc: 144
% ls -l save.dat 
-rw-r--r--  1 ogihara  ogihara  327 10  1 18:51 save.dat
% ./twoway
 11 32 78 144
8
 8 11 32 78 144
200
 8 11 32 78 144 200
50
 8 11 32 50 78 144 200		# ここで Ctrl-D を入力
dealloc: 8
dealloc: 11
dealloc: 32
dealloc: 50
dealloc: 78
dealloc: 144
dealloc: 200
% ls -l save.dat 
-rw-r--r--  1 ogihara  ogihara  454 10  1 18:52 save.dat
