为啥我不能在 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?的主要内容,如果未能解决你的问题,请参考以下文章

super this 为啥不能同时存在

子类为啥不能直接调用父类的属性

如果 .Net Core 可以在 Windows 上运行,为啥不能在 .Net Framework 中引用 .Net Core DLL?

为啥我必须最后调用 super -dealloc,而不是先调用?

为啥我不能用主包中的方法集合调用接口

java中子类继承了父类就可以使用父类的方法了,那为啥还要用super?