1

我想像使用普通对象(以及它的常规函数​​)一样使用我的自定义 NSManagedObject。是否可以修改类以便能够像普通对象一样对其进行初始化?

[[myManagedObject alloc] init];

谢谢

编辑:为了澄清这个问题,如果我在实现中用@synthesize 更改@dynamic,它会搞砸一切吗?

4

2 回答 2

3

我经常在我的一个应用程序中这样做。我的方法是初始化对象:

-(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];
于 2010-04-23T20:32:56.410 回答
2

托管对象上下文是 NSManagedObject 的必需属性,因此如果不将其插入上下文中,您将无法正确初始化它的实例。它查看上下文以了解其实体,并在其任何属性更改时通知上下文。

@dynamic 和 @synthesize 只是编译器指令。只要您自己提供适当的 getter 和 setter,您就可以从 @dynamic 切换到 @synthesize。由于 NSManagedObject 严重依赖键值观察来运行,因此您必须编写符合 KVO 的访问器。

如果你需要初始化一个 NSManagedObject 子类,你可以重写awakeFromInsert它,让你在创建实例时提供自定义。您还可以在每次使用 获取对象时对其进行自定义awakeFromFetch

于 2010-04-23T16:21:19.023 回答