1

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

Apple 文件称这是取消注册 KVO 的正确位置。

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

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

注意:以前我dealloc在这个类中重写,但后来意识到这不推荐用于 NSManagedObject 的子类。我已经将此代码移入-didTurnIntoFault. 我目前没有覆盖 Apple 文档说您不应该覆盖的任何其他方法。

4

2 回答 2

3

为了后代:我有同样的问题。就我而言,我有一个对象A与对象B具有(一对一)关系。当A被删除时, B与A的反比关系被设置为null。这导致BobserveValueOfKeyPath:ofObject:change:context方法被调用(keypathBA的关系在哪里)。不幸的是,此方法检查了 A 的属性导致 A 的故障取消(请注意,在这种情况下awakeFromFetch不会被调用——我认为是因为该对象实际上从未进入故障状态)。因此,我可能会接到第二个电话willTurnIntoFault稍后,该对象将再次尝试注销 KVO,从而导致崩溃——就像在 OP 中一样。

对我来说,解决方案是将 A 的删除规则更改为级联,以便在删除 A 对象时删除 B 对象并取消注册 KVO in prepareForDeletion。这很重要,因为在实际删除B之前,删除A仍会导致B的逆关系设置为 nil 。

请注意,prepareForDeletion在之前调用但不是代替willTurnIntoFault. 因此,如果您在两者中都取消注册 KVO,则需要维护一些状态以确保您尚未取消注册。

于 2011-08-15T09:39:33.943 回答
0

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

于 2010-12-01T09:34:04.913 回答