1

NSManagedObject私のオーバーライドされた実装のサブクラスではwillTurnIntoFault、問題のオブジェクトを最初に作成したコードを元に戻すときに、 が 2 回呼び出されています。これにより、キー パスで KVO の登録を二重に解除しようとすると、クラッシュが発生します。

Apple のドキュメントによると、ここが KVO の登録を解除するのに適した場所です。

ちょっとしたコンテキスト - 元に戻す操作には、モデルの対応するビューをそのスーパービューから削除することが含まれます。ビューはそのモデルを保持します。

だから私の質問は:のサブクラスで 2 回呼び出される可能性があるプログラマ エラーの種類は何ですか?willTurnIntoFaultNSManagedObject

注: 以前deallocはこのクラスでオーバーライドしていましたが、NSManagedObject のサブクラスには推奨されないことに気付きました。それ以来、このコードを に移動しました-didTurnIntoFault。私は現在、Apple のドキュメントでオーバーライドしてはならないと言われている他のメソッドをオーバーライドしていません。

4

2 に答える 2

3

後世のために:私は同じ問題を抱えていました。私の場合、オブジェクトBとの(対1)関係を持つオブジェクトAがありました。Aが削除されたとき、 Aに対するBの逆関係は に設定されました。これにより、Bのメソッドが呼び出されました ( BとAの関係はどこにありましたか)。残念ながら、このメソッドは A のプロパティをチェックしたため、Aフォルトが取り消されました (この状況では が呼び出されないことに注意してください。オブジェクトが実際にフォルト状態になったことがないためと推測されます)。したがって、2回目の呼び出しを受ける可能性がありますnullobserveValueOfKeyPath:ofObject:change:contextkeypathawakeFromFetchwillTurnIntoFault後で、オブジェクトは再び KVO の登録を解除しようとし、その結果、OP と同様にクラッシュが発生しました。

私にとっての解決策は、A の削除ルールをカスケードに変更して、A オブジェクトが削除されたときに B オブジェクトが削除され KVO の登録を解除することでしたprepareForDeletionAを削除すると、 Bが実際に削除される前にBの逆関係が nil に設定されるため、これは重要です。

prepareForDeletionは前に呼び出されますが、代わりには呼び出されないことに注意してくださいwillTurnIntoFault。したがって、両方で KVO の登録を解除する場合は、まだ登録を解除していないことを確認するために、何らかの状態を維持する必要があります。

于 2011-08-15T09:39:33.943 に答える
0

この問題は、willTurnIntoFault 内から KVO 値を設定/設定解除するカスタム セッター メソッドによって引き起こされたようです。

于 2010-12-01T09:34:04.913 に答える