3

NSCoder複数のオブジェクトによって共有およびエンコードされたオブジェクトが、次にデコードされたときにどのように処理されるのか疑問に思っていました。オブジェクトのコピーを 2 つ作成するか、それとも 1 つのオブジェクトをデコードして、それをデコードする他のすべてのオブジェクト間で共有するか?

以下に、このような状況の小さな例を示しました。

例:

  1. アプリケーションが起動します
  2. オブジェクト A とオブジェクト B がオブジェクト C をデリゲートとして設定する
  3. アプリケーションは終了通知を受け取ります。
  4. オブジェクト A とオブジェクト Bは、自身とそのすべてのオブジェクト (デリゲートを含む) をエンコードします。
  5. アプリケーションがシャットダウンして再起動する
  6. オブジェクト A とオブジェクト Bは、自身とそのすべてのオブジェクト (デリゲートを含む) をデコードします。

ステップ 6 の後、オブジェクト A とオブジェクト B の両方が同じデコードされたオブジェクトを共有するでしょうか、それともそれぞれが独自のコピーを持っているでしょうか?

4

3 に答える 3

7

それらは同じオブジェクトへの参照を共有します(その振る舞いを変更するために長々と移動しない限り)。

つまり、NSCodingは、完全に循環的で、全方向性で、複雑に接続されたオブジェクトグラフを処理できます(すべてのグラフ参加者がNSCodingを正しくサポートしている限り)。

デリゲートのエンコードは非常に非定型であることに注意してください。デリゲートは通常、アーカイブ後にアーカイブされていないオブジェクトグラフに接続され、デリゲートはアーカイブされたモデルレイヤー(またはIBの場合はアーカイブされたビューレイヤー)間の一種の導管として機能します。実際、XIBファイルの場合はストーリーがより複雑になります。 。しかし...十分に近い)とアプリの残りの部分。

于 2011-09-26T23:58:25.933 に答える
0

最初の答えが完全に正しいとは思いません。Apple のドキュメントによると、「シリアル化では、オブジェクトの値と階層内の位置のみが保持されます。同じ値のオブジェクトへの複数の参照は、逆シリアル化されると複数のオブジェクトになる可能性があります」。

そのため、シリアル化された単一のオブジェクトが、これらの複数の NSCoder から逆シリアル化されたときに単一のオブジェクトになるという保証はありません。

実装があなたの例のようなものである場合、物事について正しく考えていない可能性があります。アプリケーションの論理的な構成について考えると、複数のオブジェクトが同じデリゲートを共有できることが理にかなっているかもしれません。しかし、一般的に、誰かが NSCoder プロトコルを使用してデリゲートをエンコード/デコードするとは思いません。通常、デリゲートがデリゲートであるオブジェクトをエンコード/デコードすることを期待します。

たとえば、NSTableView を見てみましょう。おそらく、ユーザーは NSTableView の表示方法を構成することができます (おそらく、ユーザーは列のサイズを変更したり、表示する列を選択したりできます)。これは、NSCoding プロトコルを使用して保存および復元する場合に役立つ情報です。NSTableView にもデリゲートがあります。デリゲートは (MVC パラダイムからの) コントローラーである必要があり、ランタイム状態を維持する必要がない汎用コードであるため、NSCoding を使用して実際にエンコード/デコードする必要はありません。

したがって、理想的には、init メソッドを使用してデリゲート/コントローラーを作成します。ユーザーが最後に構成したときと同じように見えるように NSTableView を構成する必要があることを認識しているため、NSCoding を使用してディスクから古いテーブル ビューを取得し、最後に表示したときと同じようにユーザーに表示します。 .

MVC パラダイムのモデル層についても同じことが言えると思います。繰り返しになりますが、コントローラー層は、ユーザーがアプリケーションを使用して行ったことに固有のモデル オブジェクトをデコードする必要があります。

モデルまたはおそらくビューレイヤーからコントローラーレイヤーをインスタンス化しようとしているように聞こえます。本当に意味がありません。

于 2011-09-27T00:05:13.813 に答える