将ivars添加到NSManagedObject子类

The*_*imp 0 core-data objective-c nsmanagedobject ios

当我使用核心数据创建实体然后NSManagedObject从中生成子类时,我得到以下输出(在.h中):

@class Foo;

@interface Foo : NSManagedObject

@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSSet *otherValues;

@end
Run Code Online (Sandbox Code Playgroud)

但是,在我的.m文件中,我想使用nameotherValues值.通常我会创建几个ivars,然后根据需要为它们添加属性.这样我就可以轻松地在我的.m文件中访问它们.

在这种情况下这样做是否可以接受?将ivars添加到.h(for nameotherValues)会导致持久性和检索对象中的任何异常行为吗?

Mar*_*n R 5

您不使用实例变量来访问Core Data托管对象的属性.

生成的实现文件包含语句

@dynamic name;
@dynamic otherValues;
Run Code Online (Sandbox Code Playgroud)

这意味着动态创建Core Data属性的getter/setter函数,例如从托管对象上下文或从底层持久性存储中检索值.

因此,您应始终使用属性来访问属性,例如:

Foo *myFoo = [NSEntityDescription insertNewObjectForEntityForName:@"Foo" inManagedObjectContext:context];
myFoo.name = @"test";
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用键值方法:

[myFoo setValue:@"test" forKey:@"name"];
Run Code Online (Sandbox Code Playgroud)

另请参阅:"核心数据编程指南"中的建模属性:

Core Data 动态生成有效的公共和原始get和set属性访问器方法...在托管对象子类中,您可以在接口文件中声明建模属性的属性,但不要声明实例变量.