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

Posted

技术标签:

【中文标题】我可以向 NSManagedObject 的子类的子类添加属性吗?【英文标题】:Can I add properties to subclass of subclass of NSManagedObject? 【发布时间】:2015-01-29 09:18:41 【问题描述】:

我有一个由核心数据生成的类Base : NSManagedObject,为了给这个实体添加一些方法,我用Derived : Base子类化了它。现在,我想将一个属性(不在Base 类中)添加到Derived 类。但是当我尝试访问添加属性的设置器时,它会引发异常:

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

有人可以帮忙吗?

编辑:似乎 NSManagedObject 的子类的子类不能有自己的方法,因为我刚刚向Derived 添加了一个方法并得到了类似的异常。这是否意味着类别是向 NSManagedObject 的子类添加方法的唯一方法?

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

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

【问题讨论】:

@Zhihhao L. 您是否尝试升级您的 .xcdatamodel?将新实体添加到 .xcdatamodel 后,您需要删除类并重新创建。 @СергейОлейнич 我没有更改数据模型。我刚刚生成了 NSManagedObject 的子类,并为这些生成的子类创建了一些子类。 @Zhihhao L. 你是否在模型中设置了继承复选框? @СергейОлейнич 不。但我的意图是对那些生成的实体类进行子类化,以提供一些自定义的属性和方法。不创建子实体。 @ZhihaoL。如果您不在核心数据模型中添加适当的字段,则无法存储额外的“派生”属性,但如果您为它们“合成”getter 和 setter(使用“@synthesize”关键字而不是“ @dynamic' 在实现文件中)。这样,核心数据将只保存数据模型(Base entity)中指定的属性,所有其他的将只存在从 fetch 到 fetch 【参考方案1】:

您还应该在 xcdatamodel 中指定继承。检查字段:xcdatamodel 中的名称、类、父实体。 Derived : Base 对于 NSManagedObjectsubclasses 来说是不够的。

【讨论】:

但是Derived 类不是子实体,而是打算成为Base 类的扩展。它的功能类似于类别,但我也想添加一些属性。【参考方案2】:

你需要选择父羊(也尝试为你设置抽象实体Base)

【讨论】:

但是Derived 不是一个实体,所以我在这个面板中找不到它。请查看编辑。【参考方案3】:

我已经解决了这个问题。

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

Derived* pointer = [Derived MR_createEntity];

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

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

编辑: 写完这个答案,我发现了一个很棒的工具mogenerator,它使用了和我上面描述的完全一样的想法,真的很方便。

【讨论】:

以上是关于我可以向 NSManagedObject 的子类的子类添加属性吗?的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 Swift 扩展向objective-c NSManagedObject 子类添加方法

NSManagedObject 子类属性

当一对多相关的 NSManagedObject 子类发生更改时,如何更新 NSManagedObject 子类?

Xcode 和核心数据 - “创建 NSManagedObject 子类”

具有未在模型中定义的附加属性的 NSManagedObject 子类

NSManagedObject 子类中的泛型类型