将ivar添加到NSManagedObject子类

时间:2010-11-28 13:42:51

标签: iphone objective-c core-data nsmanagedobject

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

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

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

那些是通常的二传手和吸气鬼。这是我使用 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子类(这是我的实体),但我不认为这是做到这一点的方法。

1 个答案:

答案 0 :(得分:4)

您无法在(in)正式协议或类别中添加实例变量。

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

标准解决方案是在表示实体的子类中添加保存瞬态数据(不会在数据库中保留)的ivar,如:

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

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