2

为了处理(几个)遗留通信协议,我尝试子类化NSCoder. 虽然编码工作正常,但我在解码时遇到了一些问题:协议不保留任何类型信息,但接收者“知道”消息的结构。我想知道,解码器如何确定对象(属性)属于哪个类。

对于 C 类型,这并不是真正的问题,因为可以调用decodeIntFromKeyetc。但对于对象,必须调用decodeObjector decodeObjectForKey:。文档告诉,那NSCoder是实现调用decodeValueOfObjCType:at:,即它知道类型。也许这些信息存储在存档器等中。但在我的情况下这不是真的。

现在,我正在告诉编码器下一个属性的类是什么:

-(id)initWithCoder:(NSCoder *)aDecoder{
    if ([super init] != nil) {
        [aDecoder nextClass:[propertyA class]];
        [self setProperyA: [aDecoder decodeObjectForKey:kKeyPropA]];
        [aDecoder nextClass:[propertyB class]];
        [self setProperyB: [aDecoder decodeObjectForKey:kKeyPropB]];
        // etc.
    }
    return self; 
}

我想,这不是一个非常优雅的解决方案。我想出的唯一其他方法是“滥用”类型信息的密钥。但是,在我的情况下,我需要密钥来确定协议中的相关对象。

因此我的问题是:解码器是否有一种优雅的方式来确定要解码的对象的类型,例如,通过回调拥有的对象?

4

0 回答 0