Objective c NSManagedObjects与类别

Objective c NSManagedObjects与类别,objective-c,ios,core-data,categories,nsmanagedobject,Objective C,Ios,Core Data,Categories,Nsmanagedobject,我认为,将NSManagedObject的自定义代码放在子类的一个类别中是一种常见的做法,因为在编辑模型时,Xcode会覆盖生成的子类。我只是想确认一下。我见过一些例子,人们说将类别与类层次结构中已经实现的方法相结合是不好的。我不确定这是否仅适用于具有实际类别的类已经实现了方法的情况,或者在所有情况下都是如此 覆盖类别中的方法的问题是,不能像通常使用[super doSomething]那样调用原始实现。通常,当您重写一个方法时,您仍然希望能够在原始实现执行之前和/或之后调用原始实现做一些额外的

我认为,将
NSManagedObject
的自定义代码放在子类的一个类别中是一种常见的做法,因为在编辑模型时,Xcode会覆盖生成的子类。我只是想确认一下。我见过一些例子,人们说将类别与类层次结构中已经实现的方法相结合是不好的。我不确定这是否仅适用于具有实际类别的类已经实现了方法的情况,或者在所有情况下都是如此

覆盖类别中的方法的问题是,不能像通常使用
[super doSomething]
那样调用原始实现。通常,当您重写一个方法时,您仍然希望能够在原始实现执行之前和/或之后调用原始实现做一些额外的事情

一个相当干净的解决方案是让Xcode生成您不直接接触的NSManagedObject子类。相反,为每个Xcode生成的NSManagedObject子类创建另一个自定义子类,您可以编辑它,而不用担心它被覆盖


Wolf Rentzsch基本上使用了这种方法,另外还生成了一些Xcode无法生成的非常方便的方法。可能值得一试,因为它可能是一个有用的工具,但mogenerator不一定要做您想做的事情。

我已经为这个问题苦苦挣扎了很长时间,终于找到了一个修改对象层次结构的解决方案。如果您感兴趣,可以在此处阅读:。当使用自动生成的NSManagedObject子类的子类时-我如何处理关系?对象A有一个对象B,想调用方法doSomething,但doSomething是在我的子类B中定义的,但核心数据没有返回我的子类B-它实际上返回了B。你知道我在哪里可以找到这样一个例子吗?@Brian我知道这是对你问题的最新回答。但这里是如何修复它的。使自动生成的NSManagedObject子类没有属性。它只包含自定义方法(这意味着您也可以将其抽象化)。然后类A可以将这个类划分为子类,并拥有自己的属性。类B也是如此。当调用类B的方法时,它会工作,因为类B从另一个自动生成的NSManagedObject继承了它的方法。简言之,超类成为接口(或Obj-c中的协议)。你的子类是数据存储+实现这个接口。@Brian,这当然与Andrew的回答相反。因为现在超类变得不可触及(从核心数据的角度来看),子类可以随意更改其数据。