正如another question中对SO(和Apple docs)所指出的那样,NSManagedObject
个实例并不强烈引用它们所源自的NSManagedObjectContext
。乍一看,这似乎是一个奇怪的决定,因为NSManagedObject
个实例在没有context
的情况下几乎无用,因为它会导致诸如faults not firing when they should之类的混乱错误。
任何人都可以提供一些背景知道为什么会这样吗?实现NSManagedObject
子类会自动保存对其NSManagedObjectContext
的强引用会不会很危险?
编辑:由于这个问题的答案很好,我发现我的托管对象是由RestKit故意临时NSManagedObjectContext
创建的。这是我的下一个问题,特别是RestKit,here。
答案 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 :)之类的方法),那么您可能会收到难以处理的意外通知。>