2009-07-06 3 views
2

ゲームでは、オブジェクトとオブジェクトのコレクションがたくさんあります。その中には他のオブジェクトへの参照が含まれているものもあります。そのような参照を維持しながら、ゲームの状態を保存するために、それらをアーカイブする簡単な方法はありますか?私がうまく理解していれば、NSArchiverはそれを行うことができますが、SDK 2では利用できませんでした.SDK 3上にありますか?リンクされたオブジェクトを簡単にアーカイブする方法

(私は一種の)best way to save/load iphone game data(前にこの質問をしてきたが、SDK 3がその間にリリースされている、と私はこの話題が進行しているかどうかを知りたいのですが。)

答えて

3

シリアル化するすべてのクラスをNSCodingプロトコルを実装する必要があります。その後、それらをNSKeyedArchiverクラスでエンコードする必要があります。そのクラスはオブジェクトを再帰的にシリアライズし、サイクルを処理します。 NSKeyedArchiverは、iPhone SDKのすべてのリリースで使用できます。オブジェクトをデコードするには、NSKeyedUnarchiverを使用します。

+0

オブジェクト間の参照は維持されますか?コレクション内のオブジェクトに別のコレクション内の別のオブジェクトへのポインタがある場合、そのオブジェクトがデコードされた後もそのポインタがそこに存在するとしますか? –

+0

はい、複数の参照とサイクルを処理します。すべてのオブジェクトがNSCodingプロトコルのinitWithCoder :, encodeWithCoder:を実装していることを確認するだけです。これがCocoaで使用される最も一般的な場所はNIBファイルです。 Interface Builderは、AppKitクラスのインスタンスとしてInterfaceを作成し、NSCoderでそれらをアーカイブします。 –

+0

それは魅力のように機能します。私は私の同様の質問に対する答えのために何ヶ月も間違っていた。それをクリアしてくれてありがとう、それは本当の人生の変革者であり、評判を持っている人は何も信じられないほどの教訓です。 :) –

0

ここでオブジェクトのシリアライズをチェックアウト:

Encoding/Decoding Objects (apple.com)

基本的に、あなたはあなたのクラスを作成する必要がキー値コーディングに準拠し、適切にすべてのデータを保存するために、バイナリプロパティリストにアーカイブします。 initWithCoder:とencodeWithCoder:関数を書いた後、それはかなり自動です!

+0

Key-ValueコーディングとNSCodingは、2つの異なる概念です。 –

関連する問題