2

我正在探索子类化NSCoder以读取/写入专有文件格式的想法。我开始相信这可能还需要我进行子类化NSArrayNSDictionary覆盖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];
    }
}

因为我忽略了 NSArray 的encodeWithCoder:实现方式,所以我想我必须重写它才能正确使用我的 NSCoder 类。

4

2 回答 2

2

我不明白你为什么认为你需要继承集合类。您的实现与默认实现有何不同?

在某些时候encodeObject:,您的NSCoder子类的方法将被调用。NSArray在该方法中,您可以根据格式要求对其进行识别和编码。我的意思是由你的NSCoder子类来调用encodeWithCoder:它遇到的对象,或者不调用它们并以其他方式对其进行编码。

于 2011-11-25T18:02:07.523 回答
0

幸运的是,您不需要继承任何集合类,例如NSArrayNSDictionary。这是因为多态性的魔力,即集合将通过调用每个对象单独对其进行编码的想法encodeWithCoder:。因此,简单地NSCoder在一个类上实现协议就足以对可能包含该类实例的集合进行编码。

于 2011-11-25T18:16:52.767 回答