Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 自动生成的实例变量如何在NSManagedObjects中工作?_Xcode_Core Data_Dynamic_Nsmanagedobject_Synthesize - Fatal编程技术网

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

Xcode 自动生成的实例变量如何在NSManagedObjects中工作?,xcode,core-data,dynamic,nsmanagedobject,synthesize,Xcode,Core Data,Dynamic,Nsmanagedobject,Synthesize,Xcode 4.5及更高版本自动合成属性,生成一个在属性名称前加下划线的实例变量。但这在NSManagedObject中是如何工作的?他们希望您在自定义setter中使用KVC基元方法。那么,如果通过NSManagedObject中的下划线ivar设置实例变量,会发生什么情况?这会不会把事情搞砸,因为它会绕过KVC方法?还是在幕后安全地执行此操作?如果直接访问下划线实例变量,则绕过了NSManagedObject为您所做的工作。您应该使用NSManagedObject为属性自动生成的获取和设置访

Xcode 4.5及更高版本自动合成属性,生成一个在属性名称前加下划线的实例变量。但这在NSManagedObject中是如何工作的?他们希望您在自定义setter中使用KVC基元方法。那么,如果通过NSManagedObject中的下划线ivar设置实例变量,会发生什么情况?这会不会把事情搞砸,因为它会绕过KVC方法?还是在幕后安全地执行此操作?

如果直接访问下划线实例变量,则绕过了
NSManagedObject
为您所做的工作。您应该使用NSManagedObject为属性自动生成的获取和设置访问器方法

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

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

您必须确保调用相关的访问和更改 通知方法(willAccessValueForKey:,didAccessValueForKey:, willChangeValueForKey:,didChangeValueForKey:, willChangeValueForKey:带有设置突变:使用对象:,和 didChangeValueForKey:带有设置突变:使用对象:)


这应该说明,仅通过直接修改实例变量无法获得正确的行为。

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


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

我了解所有这些。但是,一个动态属性的getter是否可以使用下划线ivar设置另一个动态属性,只要它在这些相关的访问和更改通知方法中封装了一行代码?为什么getter会充当不同属性的setter?这是一个不寻常的副作用。为什么不使用自动生成的setter方法呢?