【问题标题】:What happens when I don't write accessor methods for Core Data scalar property?当我不为 Core Data 标量属性编写访问器方法时会发生什么?
【发布时间】:2012-12-14 18:20:20
【问题描述】:

我正在处理用于生成 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 子类的实例。我已向此类的实例发送了setPointsScored:pointsScored 消息,并将生成的实例保存到其持久性存储中。一切似乎都正常。

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

【问题讨论】:

  • 呃...我也不写这些...我认为 CoreData 现在实际上会为您创建它们?
  • 现在确实如此,文档有误

标签: objective-c core-data nsmanagedobject


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的参考,Martin - 文档似乎已经过时,但令人欣慰的是,Apple 至少在某处提到了该更改。
猜你喜欢
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 2010-09-15
  • 1970-01-01
  • 2011-10-20
相关资源
最近更新 更多