为什么NSManagedObject实例没有强大的NSManagedObjectContext引用?

时间:2014-05-15 19:35:38

标签: ios objective-c core-data nsmanagedobject nsmanagedobjectcontext

正如another question中对SO(和Apple docs)所指出的那样,NSManagedObject个实例并不强烈引用它们所源自的NSManagedObjectContext。乍一看,这似乎是一个奇怪的决定,因为NSManagedObject个实例在没有context的情况下几乎无用,因为它会导致诸如faults not firing when they should之类的混乱错误。

任何人都可以提供一些背景知道为什么会这样吗?实现NSManagedObject子类会自动保存对其NSManagedObjectContext的强引用会不会很危险?

编辑:由于这个问题的答案很好,我发现我的托管对象是由RestKit故意临时NSManagedObjectContext创建的。这是我的下一个问题,特别是RestKit,here

3 个答案:

答案 0 :(得分:6)

NSManagedObjectContext拥有NSManagedObject s比使用其他方式更有意义。

请记住,上下文就像一个绘图板,上面有所有对象。如果该上下文消失,则对象不再有效。如果对象拥有上下文,那么上下文将不会对对象做任何事情,并且它们看起来仍然有效。换句话说:没有对象就可以存在上下文,没有上下文就不能存在对象。

当然,混合模型(上下文拥有其对象和对象拥有其上下文)也不会起作用,因为那样你会遇到一个保留周期。

  

NSManagedObject实例在没有上下文的情况下几乎无用

他们可以(但不一定),但请记住,他们确实有他们的背景的参考!据推测它是一个弱参考,但仍然是一个参考。如果该引用返回nil,该对象无效。如果你确保你的背景保持不变(这是我在回答另一个问题时所做的),你就不会有任何问题。

答案 1 :(得分:3)

这是因为您将获得保留周期。托管对象上下文在内部使用数组和其他容器,这些容器引用了托管对象。

可能这个保留周期不能明确地被打破"这很容易通过Core Data的内部实现,因此这个引用必须是弱的。

答案 2 :(得分:0)

  

实现一个NSManagedObject子类来自动持有对其NSManagedObjectContext的强引用是否危险?

正如其他人指出的那样,这将很危险,因为您将创建一个保留周期。

一种更好的做法是订阅通知

  

NSManagedObjectContextObjectsDidChange

在这里,只要上下文通知您对象已更改,您就可以更新它们。

示例:

- (void)addObservers
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(managedObjectContextChanged) name:NSManagedObjectContextObjectsDidChangeNotification object:_myManagedObjectContext];
}

- (void)managedObjectContextChanged
{
    [self fetchObjects];
}

此外,正如Apple指出的那样,请确保传递您要观察的上下文:

  

几个系统框架在内部使用Core Data。如果您注册以从所有上下文接收这些通知(通过将nil作为对象参数传递给诸如addObserver(_:selector:name:object :)之类的方法),那么您可能会收到难以处理的意外通知。