1

我正在使用用于生成 NSManagedObject 子类的几个核心数据实体,在生成这些类时,我选择了“使用原始数据类型的标量属性”选项。正如预期的那样,在生成的接口中,整数属性被声明为int16_t属性,浮点属性被声明为属性:float

@interface TeamStats:NSManagedObject
@property (nonatomic) int16_t pointsScored;
@property (nonatomic) float winPercentage;
@end

在此接口的生成实现中,我看到这些属性声明为@dynamic

@implementation TeamStats
@dynamic pointsScored;
@dynamic winPercentage;
@end

现在,根据 Core Data 文档,我应该需要为这些标量属性编写访问器方法,因为 Core Data 无法为我生成它们:

您可以将属性声明为标量值,但对于标量值,Core Data 不能动态生成访问器方法——您必须提供自己的实现(参见“托管对象访问器方法”(第 44 页))。Core Data 自动合成原始访问器方法(primitiveLength 和 setPrimitiveLength:),但您需要声明它们以抑制编译器警告。

这一切都是有道理的,我可以看到许多 SO 帖子询问应该如何编写这些访问器方法,并提供了很多好的答案。

我想不通的是:我在阅读文档中的这个细节之前就编写了这段代码并开始使用它,所以我从未编写过任何访问器方法。我的类实现中只有@dynamic 声明。尽管没有编写我应该需要的访问器方法,但代码似乎工作得很好。我已经创建了这个 NSManagedObject 子类的实例。我已发送此类 a 的实例setPointsScored:和一条pointsScored消息,并将生成的实例保存到其持久性存储中。一切似乎都奏效了。

我在这里想念什么?尽管 Core Data 文档说了什么,是否会生成默认实现?是否会有我需要注意的当前代码不起作用的情况?在编写更多 NSManagedObject 子类之前,我很想了解这里发生了什么......

4

1 回答 1

5

为原始数据类型创建标量访问器是 Xcode 4 引入的一项功能,但显然没有很好的文档记录。WWDC 2011 会议视频中提到了它

  • “303 iOS 核心数据的新功能”(幻灯片 95)
  • “315 Mac OS X 上核心数据的新功能”(幻灯片 90)

根据这些会话的信息,标量访问器避免了构造NSNumber对象的开销,因此它们比“核心数据编程指南”中显示的实现更有效。

所以回答你的问题:标量属性的默认访问器是自动生成的。“Core Data Programming Guide”关于这个特性已经过时了。

于 2012-12-30T13:43:12.733 回答