Core data willTurnIntoFault被多次调用,导致崩溃

Core data willTurnIntoFault被多次调用,导致崩溃,core-data,nsmanagedobject,nsundomanager,key-value-observing,Core Data,Nsmanagedobject,Nsundomanager,Key Value Observing,在NSManagedObject的子类中,当撤消最初创建相关对象的某些代码时,将调用我的willturnitofult的重写实现两次。当试图在密钥路径上双重注销KVO时,这会导致崩溃 苹果的文件说这是取消KVO注册的正确地点 一点上下文-撤消操作涉及从模型的superview中删除相应的模型视图。视图将保留其模型 所以我的问题是:什么样的程序员错误会导致在NSManagedObject的子类中调用两次willturnitofult? 注意:以前我在这个类中重写了dealloc,但后来意识到这不建

NSManagedObject
的子类中,当撤消最初创建相关对象的某些代码时,将调用我的
willturnitofult
的重写实现两次。当试图在密钥路径上双重注销KVO时,这会导致崩溃

苹果的文件说这是取消KVO注册的正确地点

一点上下文-撤消操作涉及从模型的superview中删除相应的模型视图。视图将保留其模型

所以我的问题是:什么样的程序员错误会导致在
NSManagedObject
的子类中调用两次
willturnitofult


注意:以前我在这个类中重写了
dealloc
,但后来意识到这不建议用于NSManagedObject的子类。此后,我将此代码移到了
-didturnintofult
。我目前没有覆盖苹果文档中说您不应该覆盖的任何其他方法。

这个问题似乎是由自定义setter方法引起的,该方法在WillTurnToFault中设置/取消KVO值。

为了子孙后代,我也有同样的问题。在我的例子中,我有一个对象A与一个对象B有(对一)关系。当A被删除时,B与A的反向关系被设置为
null
。这导致调用B的
observeValueOfKeyPath:ofObject:change:context
方法(其中
keypath
是B与A的关系)。不幸的是,此方法检查了a的属性,导致a的故障被取消(注意,在这种情况下,
awakeFromFetch
不会被调用——我猜想是因为对象从未真正进入故障状态)。因此,稍后我可能会再次调用
willturnitofult
,对象会再次尝试注销KVO,导致崩溃——就像在OP中一样

对我来说,解决方案是将A的删除规则更改为级联,这样当A对象被删除时B对象被删除,而
preparefordelection
中的KVO被注销。这一点很重要,因为删除A仍然会导致B的反向关系在实际删除B之前设置为零

请注意,
preparefordelection
之前被调用,而不是在
将变为故障之前被调用。因此,如果在这两种情况下都取消注册KVO,则需要保持某种状态以确保尚未取消注册

很好的观察力(尽管来自于学校的严厉打击)。