Core Data 无法生成原始访问器

Posted

技术标签:

【中文标题】Core Data 无法生成原始访问器【英文标题】:Core Data fails to generate primitive accessors 【发布时间】:2010-12-19 05:41:36 【问题描述】:

根据我对 Core Data 的理解,原始访问器工作所需要的只是属性名称的 @dynamic 指令(以及在实体实现中为该属性声明原始访问器)。

由于某种原因,当使用生成的原始访问器时,setState: 方法没有修改状态属性:

- (int)state 

    NSNumber * tmpValue;

    [self willAccessValueForKey:@"state"];
    tmpValue = [self primitiveState];
    [self didAccessValueForKey:@"state"];

    return [tmpValue intValue];


- (void)setState:(int)value 

    [self willChangeValueForKey:@"state"];
    [self setPrimitiveState:[NSNumber numberWithInt:value]];
    [self didChangeValueForKey:@"state"];

在使用键值编码版本时修改状态属性

- (int)state 

    NSNumber * tmpValue;

    [self willAccessValueForKey:@"state"];
    tmpValue = [self primitiveValueForKey:@"state"];
    [self didAccessValueForKey:@"state"];

    return [tmpValue intValue];


- (void)setState:(int)value 

    [self willChangeValueForKey:@"state"];
    [self setPrimitiveValue:[NSNumber numberWithInt:value] forKey:@"state"];
    [self didChangeValueForKey:@"state"];

在这两种情况下,I 原始访问器都声明如下(并根据 Apple 的示例和代码生成):

@interface Post (CoreDataGeneratedPrimitiveAccessors)

- (NSNumber *)primitiveState;
- (void)setPrimitiveState:(NSNumber *)value;

@end

我有点不知道为什么会这样。任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

经过大量的摸索、调试、摆弄和猜测和检查,我终于弄清楚了问题所在:如果将这些属性定义为实例变量,核心数据原始访问器就不会动态生成。我为调试目的定义了它们(因为 GBD 似乎无法在没有定义 ivars 的情况下看到属性的值),这阻止了原始访问器的正确生成。这是苹果应该以某种形式真正记录下来的东西。因为一个人很难发现。我希望这可以帮助其他遇到同样问题的人!

【讨论】:

【参考方案2】:

我一直在研究这一点,发现其中一件事是,与文档相反,从数据模型生成的实现文件没有列出原始动态访问器。其他地方声明您必须自己添加它们。会不会是这个问题?

【讨论】:

【参考方案3】:

您是否正在使用/修改 Xcode 生成的 NSManagedObject 的代码?我相信默认情况下,这些是由#if 0 指令“注释”生成的。

【讨论】:

我绝对没有放弃它,所以这不是问题。而且,如果我有,它并不能解释为什么 KVC 版本确实有效。 KVC 版本可以从 NSManagedObject 实现中运行,确定吗?如果您在实现文件中留下了#if 0,那么编译器将不会构建它与#endif 之间的任何方法。 我已经完全删除了#if #endif 语句,所以这不是问题。【参考方案4】:

只是想说我遇到了同样的问题,不得不根据您在此处的评论切换到 setPrimitiveValue 和 originalValueForKey。默认实现不起作用,这让我很困扰。在我的例子中值得注意的是,我正在继承另一个 NSManagedObject。不知道你是否也是这种情况。

【讨论】:

以上是关于Core Data 无法生成原始访问器的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 自定义访问器甚至没有被调用

使用 Core Data 获取生成“无法识别的选择器错误”?

核心数据原始访问器

CoreData - 原始访问器作为属性?

核心数据 - 原始设置器/获取器更快吗?啥时候不使用?

TS1086:无法在环境上下文中声明访问器