我可以将属性添加到 NSManagedObject 的子类的子类吗?

Can I add properties to subclass of subclass of NSManagedObject?

我有一个由核心数据生成的classBase : NSManagedObject,为了给这个实体添加一些方法,我用Derived : Base子class它。现在,我想添加一个 属性(不在 Base class 中)到 Derived class。但是当我尝试访问添加的 属性 的 setter 时,它抛出异常:

caught "NSInvalidArgumentException", "-[Base setAddedProperty:]: unrecognized selector sent to instance 0x7fdcc31b36d0"

有人能帮忙吗?

EDIT: 似乎 NSManagedObject 的 subclass 的 subclass 不能有自己的方法,因为我刚给 [=14 添加了一个方法=] 并得到类似的异常。这是否意味着类别是向 NSManagedObject 的 subclass 添加方法的唯一方法?

编辑: 我将配置中实体的 "Class" 更改为 Derived,现在一切正常。可以访问所有这些新添加的属性并可以调用自定义方法。为什么?这是一个好习惯吗?

编辑: 上面的描述似乎被误解了。我打算将核心数据生成的实体 class 子classes 以提供自定义的方法和属性,而不是创建子实体。因此,Derived 不是数据模型中的实体。

您还应该在 xcdatamodel 中指定继承。检查字段:名称、Class、xcdatamodel 中的父实体。 Derived : Base 不足以容纳 NSManagedObject 个子类。

你需要select 母羊(也尝试为你设置抽象实体Base)

我解决了这个问题。

在我的 .xcdatamodeld 文件中,我将 Base 实体映射到 Base class。在我的代码中,我通过以下方式创建了一个实例:

Derived* pointer = [Derived MR_createEntity];

此方法为我调用 NSEntityDescriptor insertNewObjectForEntityForName:inManagedObjectContext。但是,尽管指针的类型为 Derived*,但此方法将 return Base 的实例而不是 Derived 的实例,如果在编译中这应该是语法错误。

因此,为了使我在 Derived 中的方法有效,我需要手动将映射从 Base 更改为 Derived

编辑: 写完这个答案后,我发现了一个很棒的工具mogenerator,它使用了与我上面描述的完全相同的想法并且非常方便。