为了处理(几个)遗留通信协议,我尝试子类化NSCoder
. 虽然编码工作正常,但我在解码时遇到了一些问题:协议不保留任何类型信息,但接收者“知道”消息的结构。我想知道,解码器如何确定对象(属性)属于哪个类。
对于 C 类型,这并不是真正的问题,因为可以调用decodeIntFromKey
etc。但对于对象,必须调用decodeObject
or 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;
}
我想,这不是一个非常优雅的解决方案。我想出的唯一其他方法是“滥用”类型信息的密钥。但是,在我的情况下,我需要密钥来确定协议中的相关对象。
因此我的问题是:解码器是否有一种优雅的方式来确定要解码的对象的类型,例如,通过回调拥有的对象?