核心数据中的非对象属性,瞬态属性

时间:2014-07-01 10:12:21

标签: ios objective-c cocoa core-data

阅读本节后感到迷失:A Non-Object Attribute

根据上面链接中包含的基本方法,在处理"瞬态属性" 时,我的自定义代码中应该有2个属性:

第一个属性,用于实际需要(不支持)的自定义类型=> 瞬态属性

第二个属性,用于阴影表示(具体支持)type => 持久属性

...

我的阅读非常愉快,直到达到" 非对象属性"这部分让我深感困惑,如下所述:

...实现实体的自定义类时,通常会为属性添加实例变量。 ... “好吧,我可以遵循这个......让iVar变得没什么大不了的”

如果使用实例变量来保存属性,则还必须实现原始的get和set访问器 “好的,我知道如何做原始访问者。为什么需要他们?因为MO中的内部优化存储可以有效地使用,我想。“

@interface MyManagedObject : NSManagedObject
  {
     NSRect myBounds; // I assume this suppose to be the **transient attribute**
  }
     @property (nonatomic, assign) NSRect bounds; // I assume this is the **persistent attribute**
     @property (nonatomic, assign) NSRect primitiveBounds; // because complier forces me to implement below primitive-accessors ?
@end   

- (NSRect)primitiveBounds
{
    return myBounds; // accessing iVAR storage for **transient attribute**? I hope so
}
- (void)setPrimitiveBounds:(NSRect)aRect
    myBounds = aRect; // accessing iVAR storage for **transient attribute**? I hope so
}

从这里下来,我有......太多?????????????未解

- (NSRect)bounds
  {
      [self willAccessValueForKey:@"bounds"]; //KVO notice of access **persistent attribute**, I guess
      NSRect aRect = bounds;                  //will this invoke primitive-Getter ???
      [self didAccessValueForKey:@"bounds"];
      if (aRect.size.width == 0)              //bounds has not yet been unarchived, Apple explained
      {

          NSString *boundsAsString = [self boundsAsString]; // unarchiving pseudo method, I guess
          if (boundsAsString != nil) //if that value is not nil, transform it into the appropriate type and cache it...Apple explained.
          {
              bounds = NSRectFromString(boundsAsString); //will this invoke primitive-Setter???
          }
       }
      return bounds;
  }

我把最后的问题列表放在这里:

1, STILL 是否需要有2个属性来处理NON-Object-Attribute,瞬态属性持久属性

2,iVar" myBounds"表示/连接" @property bounds"?这是" @property界限" MOM中的建模属性?

3,这里实现原始访问器的目的是什么?为了强制我写KVO(会......做...)方法对吗?用于在iVar" myBounds"和#34; @property bounds"之间传递值(进出)?

4,在这行代码中

 bounds = NSRectFromString(boundsAsString); //will this invoke primitive-Setter???

是原始的Setter被称为OR public / standard-Setter被称为?为什么呢?

1 个答案:

答案 0 :(得分:1)

在iOS中,有非常方便的NSStringFromCGRectCGRectFromNSString功能。为什么不直接使用它们并存储字符串?

您的问题:

  1. 是的,您需要2个属性,如文档中所述。
  2. 是的,这是基于托管对象模型。 primitiveX的{​​{1}}名称会自动生成/解释。
  3. 你需要这里的原始访问器方法来使它成为KVC - 而原语不是这种情况。