为啥我不能在 super 上调用 Core Data Accessors?
Posted
技术标签:
【中文标题】为啥我不能在 super 上调用 Core Data Accessors?【英文标题】:Why can I not call Core Data Accessors on super?为什么我不能在 super 上调用 Core Data Accessors? 【发布时间】:2010-11-08 16:28:55 【问题描述】:背景
我正在使用相当出色的mogenerator 来自动生成我的核心数据访问器。
mogenerator 将类构造如下:
NSManagedObject
_JGTrainingBase
JGTrainingBase
_JGTrainingGroup
JGTrainingGroup
以下划线开头的类是由 mogenerator 使用核心数据访问器机器生成的。
没有下划线的类是人工可编辑的,因此您可以将自定义方法放入其中,并且在更改数据模型和重新运行 mogenerator 时不会被覆盖。
训练组实体具有称为“children”的一对多关系。
我正在使用 Core Data 访问器来修改我的关系。
我想要什么
我想在添加子对象之前更新持续时间 - 一个瞬态属性。
问题
我的代码
@implementation JGTrainingGroup
...
-(void)addChildrenObject:(JGTrainingGroup *)value_
[self updateDuration];
[super addChildrenObject:value_];
...
@end
但是当我调用这个方法时,我得到一个错误信息:
[JGTrainingGroup addChildrenObject:]: unrecognized selector sent to instance 0x10667fa30
生成的代码
@interface _JGTrainingBase : NSManagedObject
// Method declarations
@end
@interface _JGTrainingBase (CoreDataGeneratedAccessors)
- (void)addChildrenObject:(JGTrainingBase*)value_;
- (void)removeChildrenObject:(JGTrainingBase*)value_;
// Lots more methods
@end
问题
为什么super没有响应addChildrenObject:方法?是否与将这些添加到类别样式中有关?
如何从子类访问 Core Data 生成的方法?
注意
我意识到我可以使用primitiveValueForKey: 和类似方法将子对象添加到集合中,但这意味着我正在重写核心数据访问器,从而浪费我的时间并且可能使我的代码出现错误。我相信 Apple 的方法比我能写的任何东西都要好。
感谢您提供任何帮助我了解这里发生了什么的意见。
【问题讨论】:
【参考方案1】:如果您有 NSManagedObject 的两个子类,其中父类实现了动态属性,并且其子类(NSManagedObject 的孙子类)覆盖了该属性的方法,则这些覆盖不能调用 super。
说ADC
您不能调用 super,因为这些访问器是运行时按需生成的
【讨论】:
啊。这完全有道理。我真的应该更彻底地阅读文档。它甚至有我可以自己实现的访问器示例。有没有其他方法可以在不编写更多代码的情况下做到这一点?如果没有,我想我只是复制示例代码并稍作修改。 不幸的是,我想不出这个问题的通用解决方案。如果您想在访问许多类的设置器时添加更新时间戳的相同功能,那么面向方面的编程可能值得一试。 Obj-C 运行时可以做很多疯狂的事情。以上是关于为啥我不能在 super 上调用 Core Data Accessors?的主要内容,如果未能解决你的问题,请参考以下文章
如果 .Net Core 可以在 Windows 上运行,为啥不能在 .Net Framework 中引用 .Net Core DLL?