将NSManagedObject子类强制转换为协议

时间:2011-08-15 02:33:20

标签: iphone ios core-data

我有一个名为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)上;将托管对象子类强制转换为协议有什么特别之处吗?

1 个答案:

答案 0 :(得分:1)

听起来x不是您期望的类的实例。强制转换避免了编译器警告,但如果实例x要响应taggedCardName,那么您的代码无论如何都会起作用。

这是什么输出?

NSLog(@"%@", [x class]);

如果你没有得到你期望的课程(例如<Card: 0x4e72090> (entity: Card; ...),那么你有一个错误课程的实例。这里有两件事需要检查:

  1. 确保您的子类.m文件和数据模型列在Build Phases&gt;中。编译目标的来源。

  2. 在数据模型中,在实体下,确保您的子类列为Class,而不是NSManagedObject。

相关问题