我有一个名为Tag的托管对象子类,它与另一个托管对象子类Card有很多关系;在我的代码中,我从商店中检索一个标签,然后访问相关的Card对象并将它们添加到一个数组中。我还有另一个托管对象子类CardVariation,它被添加到数组中。
Card和CardVariation都符合TaggedCard协议;当我访问存储在数组中的对象时,我将它们转换为TaggedCard协议:
id<TaggedCard> x = (id<TaggedCard>)[theArray objectAtIndex:i];
然后我尝试向对象发送TaggedCard消息:
NSString *y = [x taggedCardName];
当这个运行时,我得到一个例外:
Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[NSManagedObject taggedCardName]: unrecognized selector sent to instance 0x4e7c620'
我可以毫无问题地将我的对象投射到卡片(或CardVariation)上;将托管对象子类强制转换为协议有什么特别之处吗?
答案 0 :(得分:1)
听起来x不是您期望的类的实例。强制转换避免了编译器警告,但如果实例x要响应taggedCardName,那么您的代码无论如何都会起作用。
这是什么输出?
NSLog(@"%@", [x class]);
如果你没有得到你期望的课程(例如<Card: 0x4e72090> (entity: Card; ...)
,那么你有一个错误课程的实例。这里有两件事需要检查:
确保您的子类.m文件和数据模型列在Build Phases&gt;中。编译目标的来源。
在数据模型中,在实体下,确保您的子类列为Class,而不是NSManagedObject。