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 无法生成原始访问器的主要内容,如果未能解决你的问题,请参考以下文章