0

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

@class Foo;

@interface Foo : NSManagedObject

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

@end

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

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

4

1 回答 1

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"];

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

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

于 2012-11-19T10:30:29.777 回答