为什么Core Data使用属性创建NSManagedObject,但没有附带的实例变量?

Coo*_*coa 2 iphone cocoa cocoa-touch core-data objective-c

正如标题所说,为什么Core Data会为每个实体的属性创建具有属性的NSManagedObject实例,但是没有附带的实例变量?问题是,我想在我的代码的某些部分以典型的alloc/init样式使用我的一些"实体".不使用Core Data的提取/上下文来创建/存储.

我想我可以保持没有实例变量,但添加它们会不会受到影响?我还可以将@dynamic更改为@synthesize,以便在我的属性/ ivars上使用KVC吗?

也许我完全错误地尝试在我的代码的某些部分使用我的一个核心数据实体而不使用核心数据API.当我可以走自己的路线时,仍然是新手.

Lou*_*arg 16

它不使用ivars的原因是那些数据不存在.加载对象时,它可能不会在其所有数据中出错.ivars只是变量,如果你并写入它们NSManagedObject没有机会在值尚未加载时出错.通过访问器NSManagedObject有一个阻塞点,如果它还没有出现故障,它允许它从磁盘读取数据,这意味着你的对象图可以被拉伸.否则你需要引入每个连接的对象.

因此,您不能只添加ivars,它们将没有您想要的值.同样,你无法从@dynamic更改为@synthesized,事情将无法正常运行.无论如何,CoreData提供的动态属性实现完全符合KVC和KVO标准.

如果要在不跳过KVO或KVC的情况下访问这些值,则可以访问"原始"值.你可以用两种方法之一做到这一点.你使用primitiveValueForKey:和setPrimitive:valueForKey:或者你可以只声明原语并让CD提供动态实现(来自文档)

@interface Department : NSManagedObject
{
}
@property(nonatomic, retain) NSString *name;
@end

@interface Department (PrimitiveAccessors)
- (NSString *)primitiveName;
- (void)setPrimitiveName:(NSString *)newName;
@end
Run Code Online (Sandbox Code Playgroud)