willTurnIntoFault被多次调用,导致崩溃

NSManagedObject
的子类中,当撤消一些最初创建相关对象的代码时,我的被覆盖的
willTurnIntoFault
实现被调用两次。当尝试在密钥路径上双重注销KVO时,这会导致崩溃。 Apple文件称这是取消注册KVO的正确位置。 一些上下文 - 撤消操作涉及从其超级视图中删除模型的相应视图。视图保留了它的模型。 所以我的问题是:什么样的程序员错误会导致
willTurnIntoFault
NSManagedObject
的子类中被调用两次? 注意:以前我在这个类中重写了
dealloc
,但后来才意识到这不推荐用于NSManagedObject的子类。我已将此代码移至
-didTurnIntoFault
。我目前还没有覆盖Apple文档说你不应该覆盖的任何其他方法。     
已邀请:
为了后人的缘故:我遇到了同样的问题。在我的情况下,我有一个对象A与对象B的(一对一)关系。当A被删除时,B与A的反向关系被设置为
null
。这导致B的
observeValueOfKeyPath:ofObject:change:context
方法被调用(其中
keypath
是B与A的关系)。不幸的是,这个方法检查了A的属性,导致A的断层被取消(请注意,在这种情况下,
awakeFromFetch
不会被调用 - 我认为因为对象从未真正进入故障状态)。因此,我可能会稍后第二次调用
willTurnIntoFault
,并且该对象将再次尝试取消注册KVO,从而导致崩溃 - 就像在OP中一样。 对我来说,解决方案是将A的删除规则更改为级联,以便在A对象被删除时删除B对象并在
prepareForDeletion
中取消注册KVO。这很重要,因为删除A仍然会导致在实际删除B之前将B的反向关系设置为nil。 注意
prepareForDeletion
之前被调用但不是
willTurnIntoFault
。因此,如果您在两者中取消注册KVO,则需要保持某种状态以确保您尚未注册。     
似乎问题是由自定义setter方法引起的,该方法是在willTurnIntoFault中设置/取消设置KVO值。     

要回复问题请先登录注册