代码之家  ›  专栏  ›  技术社区  ›  John Gallagher

为什么我不能调用super上的核心数据访问器?

  •  5
  • John Gallagher  · 技术社区  · 14 年前

    背景

    我用的是相当好的 mogenerator

    mogenerator按如下方式构造类:

    NSManagedObject
        _JGTrainingBase
            JGTrainingBase
                _JGTrainingGroup 
                    JGTrainingGroup
    
    • 以下划线开头的类是由mogenerator用核心数据访问器生成的。

    • 不带下划线的类是人工可编辑的类,因此您可以将自定义方法放在其中,并且在更改数据模型并重新运行mogenerator时不会覆盖它。

    • 培训小组的实体有许多关系,称为“儿童”。

    • 我正在使用核心数据访问器来修改我的关系。

    我想要什么

    我想在添加子对象之前更新duration-一个临时属性。

    问题

    @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
    

    1. 为什么super不响应addChildrenObject:method?是不是和这些被添加到类别样式中有关?

    2. 如何从子类访问核心数据生成的方法?

    注意

    谢谢你的帮助我了解这里发生了什么。

    1 回复  |  直到 14 年前
        1
  •  3
  •   Martin Brugger    14 年前

    如果有两个子类NSManagedObject,父类在其中实现动态属性,其子类(NSManagedObject的孙子)重写该属性的方法,则这些重写不能调用super。

    ADC