当我不为Core Data标量属性编写访问器方法时会发生什么?

时间:2012-12-30 00:27:18

标签: objective-c core-data nsmanagedobject

我正在使用几个用于生成NSManagedObject子类的Core Data实体,当我生成这些类时,我选择了“使用原始数据类型的标量属性”选项。正如所料,整数属性被声明为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页))。核心数据自动合成   原始访问器方法(primitiveLength和setPrimitiveLength :),但您需要   声明它们以禁止编译器警告。

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

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

我在这里缺少什么?是否存在生成的默认实现,尽管Core Data文档说明了什么?是否会出现我当前的代码无法正常工作的情况?在编写更多NSManagedObject子类之前,我很想了解这里发生了什么......

1 个答案:

答案 0 :(得分:5)

为原始数据类型创建标量访问器是Xcode 4引入的一个功能,但显然没有详细记录。它在WWDC 2011 Session视频中提到

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

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

所以回答你的问题:自动生成标量属性的默认访问器。 “核心数据编程指南”在此功能方面已经过时。