オブジェクトの暗号化
オブジェクトの暗号化は、オブジェクトクラスの ID と状態を変換し、保存されまたはプロセス間で転送することができる形式に変換します。クラスの型とインスタンスデータは、プログラムの終了後も永続できるバイト・ストリームに書き込まれます。プログラムを再度起動すると、新しく割り当てられたオブジェクトは、それ自身の記憶された表現を暗号化し、その前の実行時の状態に自分自身を復元できます。暗号化は通常、ファイルシステムに書き込むことができる形式(アーカイブ) にオブジェクトのグラフを置き、アーカイブと協力して発生します。アーカイブした物にアンアーカイブ操作をするのは、それ自体を復号するために、保存されたグラフ内の各オブジェクトを求めます。
オブジェクトの暗号化もまた、あるプロセスから他へ、オブジェクトを転送するための OS X の分散オブジェクト API で使用されています。しかし、その最も一般的な用途は、プロパティリストのように、オブジェクトの永続性のためのメカニズムの、アーカイブのためです。
オブジェクトの暗号化と復号化する方法
サブクラスでは、そのインスタンスを暗号化および復号化するため、NSCoding プロトコルに準拠し、二つのメソッド、initWithCoder: と encodeWithCoder: を実装しなければなりません。プログラムがオブジェクト・グラフをアンアーカイブまたはアーカイブすると、これらのメソッドが呼び出されます。 encodeWithCoder: メソッドでは、オブジェクトの重要なインスタンス変数の値を暗号化します。 initWithCoder: メソッドでは、それらの値を復号化し、それらのインスタンス変数を再割り当てします。オブジェクトが initWithCoder: メッセージを受信した場合は、その初期化メソッドのいずれも呼び出されません。
initWithCoder: の唯一の引数と、encodeWithCoder: は、NSCoder オブジェクトであり、その目的は実際の復号化や暗号化を実行することです。NSCoder は、抽象クラスであるため、コーダオブジェクトは、ほとんどの場合、以下の具象サブクラスの内の一つのインスタンスです、すなわちNSKeyedArchiver、NSKeyedUnarchiver:、NSArchiver、NSUnarchiver: です。アーカイバのクラスは、オブジェクトのインスタンス変数を暗号化するためのメソッドを宣言します。アンアーカイバのクラスは、インスタンス変数を復号化するためのメソッドを宣言します。
NSCoder メソッドはオブジェクト、スカラー、C 言語の配列、構造体、文字列、およびこれらの型へのポインタで動きます。独自のクラスのインスタンス変数を暗号化したり、復号化する前に、まず、スーパークラスの initWithCoder: や encodeWithCoder: の実装を呼び出すようにしてください。バイトストリームからオブジェクトを復号化するときは、それらのインスタンス変数に割り当てるときにそれらを保持するか、コピーしてください。
キー付き対連続的アーカイブ
NSCoder の2つの具象サブクラスは、基本的な方法で互いに異なっています。"鍵付き" アーカイバクラス(NSKeyedArchiver と NSKeyedUnarchiver) は、文字列キーで暗号化された値を伴い、その値を復号化するとき、同じキーを使用します。このようにしてインスタンス変数は暗号化され、任意の順序で復号化されます。他のタイプのコーダ(NSArchiver と NSUnarchiver) を使用すると、特定の順序でインスタンス変数を暗号化し、同じ順序でそれらを復号化しなければなりません。連続的コーダーは、従来のコードと一緒にのみ使用する必要があり、新しいサブクラスはキー付きアーカイブコーダを使用する必要があります。
前提条件の記事
関連記事
既出の議論
オブジェクトの暗号化と復号化
サンプルコードプロジェクト
Reducer
次の章
前の章