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