もう 1 つのオプションは、キー値の観察です。次のように設定します。
const static void *kParentObservingChildSomePropertyContext = &kParentObservingChildSomePropertyContext;
[child addObserver: child.parent forKeyPath: @"someProperty" options: /*see below*/ context: kParentObservingChildSomePropertyContext];
スーパークラスまたはサブクラスの観測コンテキストを踏まないように、すべての観測コンテキストが一意である必要があるため、奇妙な定数定義が存在します。どのオプションを設定する必要があるかを確認するには、マニュアルを参照して、特定のニーズと比較してください。子オブジェクトのプロパティが変更されるたびに、親は次を受け取ります。
-(void)observeValueForKeyPath: (NSString *)path ofObject: (id)object change: (NSDictionary *)change context: (void *)context;
観察の正しいコンテキストがあることを確認してから、変更を処理します。ここで別のコンテキストが表示された場合は、メッセージを に転送してくださいsuper
。
パスの監視が完了したら、親を子のオブザーバーとして削除します。
[child removeObserver: child.parent forKeyPath: @"someProperty" context: kParentObservingChildSomePropertyContext];
-addObserver:forKeyPath:options:context
観測の正しいインスタンスが削除されるように、使用したのと同じコンテキスト ポインターを使用します。
ただし、2 つの NSManagedObjects 間で委任を使用することは、一方が他方への参照を失わないようにすることが困難であることを考えると、危険な考えのように思えます。
特定のオブジェクトからの通知の委任、監視、および監視はすべて、この問題に悩まされます。通知に関心のある有効期間が、関連するオブジェクトの有効期間と一致することを確認する必要があります。そうしないと、監視情報を簡単に「漏えい」したり、さらに悪いことに、古いオブジェクト ポインターに通知を送信したりする可能性があります。これらの解決策はどれもそれを免れることはできませんが、Delegate パターンの場合、親オブジェクトが消えたときに子がそれ以上委任しようとしないようにするために、弱い参照をゼロにすることを使用できます。