【问题标题】:Adding ivar to an NSManagedObject subclass将 ivar 添加到 NSManagedObject 子类
【发布时间】:2010-11-28 22:05:10
【问题描述】:

我有一个与 iPhone 中的核心数据一起使用的 NSManagedObject 类的子类。但是,我有一个临时“字段”(ivar),我想在该类中添加(但我不想将它保存在数据存储中)。尝试使用非正式和正式协议,但它们都给了我类似“静态变量”的行为。 (它的行为类似于类变量而不是实例变量)。有什么建议吗?

我的第一次尝试,创建了测试“Dummy-class”,它应该是 NSManagedObject 的子类,然后我创建了测试类别

@interface Test (custom)
   NSString *_string  ;
  - (void)setString:(NSString *)newString;  
  - (NSString *)string;
@end

这些是通常的 setter 和 getter。这是我使用 Test 类的方式

Test *a = [[Test alloc] init];  
Test *b = [[Test alloc] init];  
[a setString:@"Test1"];  
NSLog(@"%@", [a string]);         //This will print out Test1

[b setString:@"Test2"];          
NSLog(@"%@", [b string]);         //This will print out Test2         
NSLog(@"%@", [a string]);         //Unfortunately, this will also print out Test2

我也可以直接弄乱 NSManagedObject 子类(这是我的实体),但我不认为这是这样做的方法。

【问题讨论】:

  • 我们欢迎您努力正确呈现代码块;但是有一个更简单的方法:首先插入一个空行,然后将代码的每一行缩进四个或更多空格!

标签: iphone objective-c core-data nsmanagedobject


【解决方案1】:

您不能在(非)正式协议或类别中添加实例变量。

类别内的任何变量定义都被视为类别外文件级别的变量定义,因此它的行为类似于类变量。这是一种令人困惑的行为;我猜编译器应该警告它。

标准的解决方案是在直接表示实体的子类中添加保存临时数据(不持久化在数据库中)的ivar,如:

@interface MyEntity:NSManagedObject{
       NSString*stringHoldingTransientSomething;
}
      ...
@end

然后将MyEntity 指定为Core Data Editor 中的类。请注意,Core Data 不会自动将 ivars 保存在您的自定义 NSManagedObject 子类中;它只保存在核心数据模型中指定的属性。因此,您可以在自定义子类中添加任意数量的簿记 ivars。

【讨论】:

  • 是的,感谢正式和非正式的协议概念解释,我同意编译器应该警告开发人员。谢谢
  • 但是如果我在更改模型后自动创建 nsmanagedobject 子类,所有的 ivars 都会被删除,对吗?有什么办法可以规避吗?
猜你喜欢
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多