0

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

我的第一次尝试,创建了测试“虚拟类”,它应该是 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 子类(这是我的实体),但我不认为这是这样做的方法。

4

1 回答 1

4

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

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

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

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

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

于 2010-11-28T14:05:10.760 回答