我想像使用普通对象(以及它的常规函数)一样使用我的自定义 NSManagedObject。是否可以修改类以便能够像普通对象一样对其进行初始化?
[[myManagedObject alloc] init];
谢谢
编辑:为了澄清这个问题,如果我在实现中用@synthesize 更改@dynamic,它会搞砸一切吗?
我想像使用普通对象(以及它的常规函数)一样使用我的自定义 NSManagedObject。是否可以修改类以便能够像普通对象一样对其进行初始化?
[[myManagedObject alloc] init];
谢谢
编辑:为了澄清这个问题,如果我在实现中用@synthesize 更改@dynamic,它会搞砸一切吗?
我经常在我的一个应用程序中这样做。我的方法是初始化对象:
-(id)initWithEntity:(NSEntityDescription *)entity insertIntoManagedObjectContext:(NSManagedObjectContext *)context
为上下文传递 nil 。要获取实体描述,您确实需要访问 managedObjectContext。我倾向于在我的应用程序启动时获取实体描述,然后将其存储在我的应用程序委托中的实例变量中。
这是一个例子:
//inside my "Engine" class
self.tweetEntity = [NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:self.moc];
//later on when I want an NSManagedObject but not in a managed object context
Tweet *tweet = [[[Tweet alloc] initWithEntity:self.engine.tweetEntity insertIntoManagedObjectContext:nil] autorelease];
这允许我使用 NSManagedObjects 而不将它们存储在数据库中。稍后,如果我决定要将对象插入到我的数据库中,我可以通过将其插入到我的托管对象上下文中来做到这一点:
[self.moc insertObject:tweet];
托管对象上下文是 NSManagedObject 的必需属性,因此如果不将其插入上下文中,您将无法正确初始化它的实例。它查看上下文以了解其实体,并在其任何属性更改时通知上下文。
@dynamic 和 @synthesize 只是编译器指令。只要您自己提供适当的 getter 和 setter,您就可以从 @dynamic 切换到 @synthesize。由于 NSManagedObject 严重依赖键值观察来运行,因此您必须编写符合 KVO 的访问器。
如果你需要初始化一个 NSManagedObject 子类,你可以重写awakeFromInsert
它,让你在创建实例时提供自定义。您还可以在每次使用 获取对象时对其进行自定义awakeFromFetch
。