【问题标题】:How do automatically generated instance variables work in NSManagedObjects?自动生成的实例变量如何在 NSManagedObject 中工作?
【发布时间】:2013-10-04 05:25:08
【问题描述】:

Xcode 4.5 和更高版本会自动合成属性,创建一个实例变量,并在属性名称前加上下划线。但是这在 NSManagedObject 中是如何工作的呢?他们希望您在自定义设置器中使用 KVC 原始方法。那么如果你通过 NSManagedObject 中的下划线 ivar 设置实例变量会发生什么?因为它会绕过 KVC 方法,所以这不会搞砸吗?还是在幕后安全地执行此操作?

【问题讨论】:

    标签: xcode core-data dynamic nsmanagedobject synthesize


    【解决方案1】:

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

    Apple's documentation 状态

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

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

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

    这应该说明你不能仅仅通过直接修改实例变量来获得正确的行为。

    【讨论】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-13
      • 2012-09-20
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2020-08-30
      相关资源
      最近更新 更多