Ios 为什么';NSManagedObject实例是否具有对其NSManagedObject上下文的强引用?

Ios 为什么';NSManagedObject实例是否具有对其NSManagedObject上下文的强引用?,ios,objective-c,core-data,nsmanagedobject,nsmanagedobjectcontext,Ios,Objective C,Core Data,Nsmanagedobject,Nsmanagedobjectcontext,正如on SO(和)中所指出的,NSManagedObject实例并不强烈引用它们起源的NSManagedObjectContext。乍一看,这似乎是一个奇怪的决定,因为NSManagedObject实例如果没有它们的上下文,几乎是无用的,因为它会导致混淆错误,例如 有人能提供一些背景资料说明为什么会出现这种情况吗?实现一个自动保存对其NSManagedObjectContext的强引用的NSManagedObject子类会有危险吗 编辑:多亏了对这个问题的出色回答,我发现我的托管对象是针对Re

正如on SO(和)中所指出的,
NSManagedObject
实例并不强烈引用它们起源的
NSManagedObjectContext
。乍一看,这似乎是一个奇怪的决定,因为
NSManagedObject
实例如果没有它们的
上下文
,几乎是无用的,因为它会导致混淆错误,例如

有人能提供一些背景资料说明为什么会出现这种情况吗?实现一个自动保存对其
NSManagedObjectContext
的强引用的
NSManagedObject
子类会有危险吗


编辑:多亏了对这个问题的出色回答,我发现我的托管对象是针对RestKit故意临时创建的
NSManagedObjectContext
。接下来是我的下一个问题,具体到RestKit,

一个
NSManagedObjectContext
拥有它的
NSManagedObject
比其他方式更有意义

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

当然,混合模型(其中上下文拥有其对象,对象拥有其上下文)也不起作用,因为这样您将进入一个保留周期

没有上下文,NSManagedObject实例几乎毫无用处


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

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

核心数据的内部实现可能无法“明确打破”这种保留周期,因此这种引用必须是弱的

实现一个自动持有对其NSManagedObject上下文的强引用的NSManagedObject子类会有危险吗

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

更好的做法是订阅通知

NSManagedObjectContextObjectsIDChange

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

例如:

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

- (void)managedObjectContextChanged
{
    [self fetchObjects];
}
此外,正如苹果指出的,一定要传递你想要观察的背景:

一些系统框架在内部使用核心数据。如果注册以从所有上下文接收这些通知(通过将nil作为对象参数传递给addObserver(u:selector:name:object:)等方法),则可能会收到难以处理的意外通知


CouchDeveloper是正确的,是的,从托管对象类添加对上下文的强引用有潜在危险。在“应该”的时候没有触发的故障可能是由许多原因造成的,但通常是访问器方法的错误实现。