当我使用核心数据创建实体然后从中生成NSManagedObject
的子类时,我得到以下输出(在.h中):
@class Foo;
@interface Foo : NSManagedObject
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSSet *otherValues;
@end
但是,在我的.m文件中,我想要使用name
和otherValues
值。通常我会创建几个ivars,然后根据需要为它们添加属性。这样我就可以轻松地在我的.m文件中访问它们了。
在这种情况下可以接受吗?将ivars添加到.h(name
和otherValues
)会导致持久性和异常行为中的任何异常行为检索对象?
答案 0 :(得分:5)
您不使用实例变量来访问Core Data托管对象的属性。
生成的实现文件包含语句
@dynamic name;
@dynamic otherValues;
这意味着Core Data属性的getter / setter函数是动态创建的,例如从托管对象上下文或从底层持久性存储中检索值。
因此,您应始终使用属性来访问属性,例如:
Foo *myFoo = [NSEntityDescription insertNewObjectForEntityForName:@"Foo" inManagedObjectContext:context];
myFoo.name = @"test";
或者,您可以使用键值方法:
[myFoo setValue:@"test" forKey:@"name"];
另请参阅:“核心数据编程指南”中的Modeled Properties:
核心数据动态生成高效的公共和原始get和 set属性访问器方法...在托管对象子类中,您 可以在接口中声明建模属性的属性 文件,但您不声明实例变量。