2010-11-28 55 views
0

我有一个与iPhone中的核心数据一起使用的NSManagedObject类的子类。但是,我有一个临时的“字段”(ivar),我想在该类中添加(但我不想将其保存在数据存储区中)。试图使用非正式和正式的协议,但他们都给我一个“静态变量”的行为。 (它的行为像一个类变量而不是实例变量)。任何建议?将伊娃添加到NSManagedObject子类

我第一次尝试,而创建的测试“虚拟级”按理说它是NSManagedObject的一个子类,然后,我创建测试类

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

这些都是常用的setter和getter。这是我用测试

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子类(这是我的实体)的混乱直接,但我不认为这是做它的方式的方式。

+0

我们欢迎您努力正确渲染代码块;但有一种更简单的方法:首先插入一个空行,然后将每行代码缩进四个或更多空格! – Yuji 2010-11-28 13:58:38

+0

感谢您的提示 – Rpranata 2010-11-28 20:09:54

回答

4

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

类别内部的任何变量定义在类别之外的文件级别被视为变量定义,所以它的行为就像一个类变量。这是一个令人困惑的行为;我猜编译器应该警告它。

标准解决方案是在子类中添加保持暂态数据的ivar(其不存在于数据库坚持)直接表示的实体,如:

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

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