プロキシオブジェクトを使用したオブジェクトを観察する
-
29-10-2019 - |
質問
プロキシオブジェクトにオブザーバーを設定し、プロキシオブジェクトが指しているものを変更しても、実際のオブジェクトの変更を監視できるようにする必要がありますか?
例がこれを最もよく説明しているかもしれません。次のことを考慮してください。
ヘッダー内: ジェネラコディセタグプレ
初期化中またはNIBメソッドからの復帰時: ジェネラコディセタグプレ
オブジェクトを変更する他のメソッド: ジェネラコディセタグプレ
これにより、aNewWidget
に変更が加えられることはありません。ただし、次のように割り当て後にaddObserver
を移動すると、機能します。
ジェネラコディセタグプレ
最初のケースが機能しないのは、オブザーバーがプロキシオブジェクトの参照のメモリポインタを監視しているためであり、プロキシオブザーバーが追加された時点ではオブジェクトがないため、監視するものがないためだと思います。ただし、ウィジェットを初期化してそれを観察した場合、プロキシオブジェクトaNewWidget
を割り当てると、割り当て後にオブザーバーを追加しない限り、変更は観察されません(もちろん、オブジェクトの変更時にオブザーバーを削除する必要があります)。
また、aNewWidget
が破壊された場合、このシナリオではどうなりますか?オブザーバーはプロキシ上にあるため、オブジェクトを破棄する前にオブザーバーを削除する必要がなくなりますか? (そうではないと思います。)
理想的には、プロキシにオブザーバーを設定し、MyController
クラスがなくなるまで、オブザーバーの追加と削除を心配することなく、プロキシオブジェクトに必要なウィジェット参照をスワップインおよびスワップアウトできるようにしたいと思います。ケース私はdeallocでオブザーバーの削除を処理できました。
ヘルプ/コメント/アドバイスをいただければ幸いです。
解決
キーパースはKVCに準拠している必要があります。だからここにコードがあります:
@interface MyController : NSObject {
MyWidgetModel * aProxyObject;
}
@property (nonatomic, retain) MyWidgetModel * aProxyObject;
.
実装ファイルで合成することを忘れないでください。次に、このコードを使用してオブザーバーを追加します。
[self addObserver:self
forKeyPath:@"aProxyObject"
options:NSKeyValueObservingOptionNew
context:nil];
.
私の編集を確認してください。ASSIGNを保持するように変更しました。多分それはあなたにとって良いです。あなたはあなたのために最善を選択しようとするべきです。私はそれがKVOで問題ではないと言いたいです。