我正在使用用于生成 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 子类之前,我很想了解这里发生了什么......