18

核心数据编程指南(我的重点):

默认情况下,Core Data 为托管对象类的建模属性(属性和关系)动态创建高效的公共原始get 和 set 访问器方法。

虽然自从我开始使用 Objective-C 以来,我一直在愉快地使用 Core Data 和mogenerator,但我从来没有看过这意味着什么,直到由于涉嫌使用私有 API 而导致应用提交被拒绝。关于生成setPrimitiveTypeValue:方法的长篇故事,但不是我的问题。

在阅读指南时,我偶然发现了实体属性的公共和原始访问器的想法。另一个引用,但更进一步:

例如,给定一个具有属性 的实体firstName,Core Data 会自动生成firstNamesetFirstName:primitiveFirstNamesetPrimitiveFirstName:

原始访问器有什么用?只是为了让您可以直接分配一个 BOOL 值,而无需将其包装在 NSNumber 中吗?如果是这样,为什么 mogenerator 会遇到生成各种<Attribute>Value, set<Attribute>Value:, primitive<Attribute>Value,setPrimitive<Attribute>Value:访问器的麻烦?

我很困惑,谁能帮帮我?


相关问题:

4

2 回答 2

12

据我了解,原始方法执行实际的获取和设置,但不发出任何 KVC 或 KVO 通知('willAccessValueForKey' 等)。公共方法调用原始方法,但将调用包装在 KVO 调用中。因此,从对象外部,您通常会调用公共方法,但如果您出于内部原因需要使用对象的属性(例如,验证或派生一些其他属性),您将使用原始方法来避免触发所有通知。

我欢迎对答案进行任何更正或澄清,因为这是我感兴趣但不完全精通的主题。

于 2011-09-15T08:24:55.633 回答
1

@jrturton 的回答涵盖了有关自定义属性一对一关系访问器方法的问题,其中公共访问器很简单。

此外,为了完全支持To-Many 关系访问器,在自定义实现中,公共访问器可能必须结合 NSMutableSet 方法(unionSet: 和 minusSet:) 调用原始访问器,这些方法必须包装在 KVO 方法对( will. ..做过...)。

于 2014-06-28T04:34:42.743 回答