我有一个由核心数据生成的类Base : NSManagedObject
,为了向这个实体添加一些方法,我将它与Derived : Base
子类化。现在,我想在Base
类中添加一个属性(不在Derived
类中)。但是当我尝试访问添加的属性的setter时,它会引发异常:
caught "NSInvalidArgumentException", "-[Base setAddedProperty:]: unrecognized selector sent to instance 0x7fdcc31b36d0"
有人可以帮忙吗?
编辑:似乎NSManagedObject的子类的子类不能拥有自己的方法,因为我刚刚向Derived
添加了一个方法,并得到了类似的异常。这是否意味着类别是将方法添加到NSManagedObject的子类的唯一方法?
编辑:我更改了" Class"配置中的实体到Derived
,现在一切正常。可以访问所有这些新添加的属性,并可以调用自定义方法。为什么?这是一个很好的做法吗?
编辑:以上描述似乎被误解了。我打算子类化由核心数据生成的实体类,以便提供自定义方法和属性,而不是创建子实体。因此,Derived
不是数据模型中的实体。
答案 0 :(得分:0)
您还应该在xcdatamodel中指定继承。检查字段:xcdatamodel中的名称,类,父实体。对于Derived : Base
子类,NSManagedObject
是不够的。
答案 1 :(得分:0)
你需要选择父羊(也尝试为你设置抽象实体)
答案 2 :(得分:0)
我解决了这个问题。
在我的.xcdatamodeld文件中,我将Base
实体映射到Base
类。在我的代码中,我通过以下方式创建了一个实例:
Derived* pointer = [Derived MR_createEntity];
此方法为我调用NSEntityDescriptor insertNewObjectForEntityForName:inManagedObjectContext
。但是,尽管指针的类型为Base
,但此方法将返回Derived
而不是Derived*
的实例,如果在编译时这应该是语法错误。
因此,为了使Derived
中的方法有效,我需要手动将映射从Base
更改为Derived
。
修改强> 写完这个答案之后,我找到了一个很棒的工具mogenerator,它使用了与我上面描述的完全相同的想法,非常方便。