2

NSCoder独自のファイル形式を読み書きするためにサブクラス化するというアイデアを検討しています。これには、適切にエンコードされるようにサブクラスNSArray化しNSDictionaryてオーバーライドする必要があるかもしれないと考え始めています。encodeWithCoder:

- (void)encodeWithCoder:(NSCoder *)encoder {
    if ([encoder isKindOfClass:[CustomCoder class]]) {
        // call [encoder encode...] as I see fit.
    }else
        [super encodeWithCoder:encoder];
}

NSCoder関連するプロトコルNSCodingは自給自足である必要があるため、これを行うのは気が進まない...プロトコルに従ってサブクラス化クラスを要求することは、悪い設計のように思えます。私は何かを誤解しているか、考えすぎていますか?!?

少し
詳しく説明します。 たとえば、ファイル形式で、アイテムのリストが次のようにエンコードされることが規定されている場合:

...      // rest of file
0xA1     // marks the beginning of a list
0x0010   // amount of item in list.  The list contains 16 items in this example.
...      // encoded items follows

配列をエンコードするには、次のencodeWithCoder:ようにする必要があると思います。

- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeValueOfObjCType:@encode(short) at:&itemCount];
    for ( /*for each item of the array*/ ) {
        [item encodeWithCoder:encoder];
    }
}

私は NSArrayencodeWithCoder:がどのように実装されているかを無視しているので、NSCoder クラスを適切に使用するにはオーバーライドする必要があると思います。

4

2 に答える 2

2

コレクションクラスをサブクラス化する必要があると思う理由がわかりません。あなたの実装はデフォルトのものとどのように異なりますか?

ある時点encodeObject:で、NSCoderサブクラスのメソッドが呼び出されます。その方法NSArrayでは、フォーマットが必要とするようにそれを認識してエンコードできます。つまり、遭遇したオブジェクトを呼び出すか、呼び出して別の方法でエンコードしないかは、NSCoderサブクラス次第です。encodeWithCoder:

于 2011-11-25T18:02:07.523 に答える
0

NSArray幸いなことに、やなどのコレクション クラスをサブクラス化する必要はありませんNSDictionary。これは、ポリモーフィズムの魔法、つまり、コレクションが各オブジェクトを呼び出しencodeWithCoder:て個別にエンコードするという考えによるものです。このため、クラスにプロトコルを実装するだけNSCoderで、そのクラスのインスタンスを含む可能性のあるコレクションをエンコードするのに十分です。

于 2011-11-25T18:16:52.767 に答える