自动生成的实例变量如何在NSManagedObjects中工作?

时间:2013-09-27 19:39:34

标签: xcode core-data dynamic nsmanagedobject synthesize

Xcode 4.5及更高版本自动合成属性,使用前缀作为属性名称的下划线创建实例变量。但是这在NSManagedObject中如何工作?他们希望您在自定义设置器中使用KVC原始方法。那么如果通过NSManagedObject中的下划线ivar设置实例变量会发生什么?不会因为绕过KVC方法而搞砸了吗?还是在幕后安全地做到这一点?

2 个答案:

答案 0 :(得分:0)

如果直接访问下划线实例变量,则会绕过NSManagedObject为您完成的工作。您应该使用NSManagedObject为您的属性自动生成的 get和set访问器方法

Apple's documentation

  

当您访问或修改托管对象的属性时,您应该这样做   直接使用这些[accessor]方法。

如果需要,您可以实现自己的访问器方法,但在这种情况下,除了更改实例变量的值之外,还必须执行其他工作:

  

您必须确保调用相关的访问权限并进行更改   通知方法(willAccessValueForKey:,didAccessValueForKey:,   willChangeValueForKey:,didChangeValueForKey:,   willChangeValueForKey:withSetMutation:usingObjects:,and   didChangeValueForKey:withSetMutation:usingObjects:)

这应该说明只需直接修改实例变量就无法获得正确的行为。

答案 1 :(得分:0)

请注意,与普通属性不同,NSManagedObject属性在编译时不会合成(因此使用@dynamic进行实现)。由于未使用编译时合成,因此没有可供您设置的合成实例变量。

相反,NSManagedObject的实例具有类似于NSMutableDictionary的私有内部实例来存储其状态。动态生成的属性访问器是用于调用访问私有存储的类似KVC的方法的包装器。