Xcode 4.5 和更高版本会自动合成属性,创建一个实例变量,并在属性名称前加上下划线。但是这在 NSManagedObject 中是如何工作的呢?他们希望您在自定义设置器中使用 KVC 原始方法。那么如果你通过 NSManagedObject 中的下划线 ivar 设置实例变量会发生什么?因为它会绕过 KVC 方法,所以这不会搞砸吗?还是在幕后安全地执行此操作?
2 回答
请注意,与普通属性不同,NSManagedObject
属性不是在编译时综合的(因此使用@dynamic
for 实现)。由于不使用编译时综合,因此没有可供您设置的综合实例变量。
相反, 的实例NSManagedObject
有一个类似于 an 的私有内部实例NSMutableDictionary
来存储它们的状态。动态生成的属性访问器是调用访问私有存储的类似 KVC 的方法的包装器。
如果您直接访问下划线实例变量,您将绕过NSManagedObject
为您完成的工作。您应该使用NSManagedObject 为您的属性自动生成的get 和 set 访问器方法。
苹果的文档状态
当您访问或修改托管对象的属性时,您应该直接使用这些 [accessor] 方法。
如果需要,您可以实现自己的访问器方法,但在这种情况下,除了更改实例变量的值之外,您还必须做一些额外的工作:
您必须确保调用相关的访问和更改通知方法(willAccessValueForKey:、didAccessValueForKey:、willChangeValueForKey:、didChangeValueForKey:、willChangeValueForKey:withSetMutation:usingObjects: 和 didChangeValueForKey:withSetMutation:usingObjects:)。
这应该说明您不能简单地通过直接修改实例变量来获得正确的行为。