プロキシオブジェクトにオブザーバーを設定し、プロキシオブジェクトが指しているものを変更しても、実際のオブジェクトの変更を監視できるようにする必要がありますか?
例がこれを最もよく説明するかもしれません。次のことを考慮してください。
ヘッダー内:
@interface MyController : NSObject {
MyWidgetModel * aProxyObject;
}
初期化またはNIBメソッドからの起動時:
-(void)awakeFromNib {
// Init the proxy object. Could be as an empty widget
[aProxyObject addObserver:self
forKeyPath:@"widgetName"
options:NSKeyValueObservingOptionNew
context:nil];
}
オブジェクトを変更する他のメソッド:
-(void)changeWidget:(MyWidgetModel *)aNewWidget {
aProxyObject = aNewWidget;
}
これにより、の変更は発生しませんaNewWidget
。ただし、addObserver
次のように割り当ての後にに移動すると、機能します。
-(void)changeWidget:(MyWidgetModel *)aNewWidget {
[aProxyObject removeObserver:self forKeyPath:@"widgetName"];
aProxyObject = aNewWidget;
[aProxyObject addObserver:self
forKeyPath:@"widgetName"
options:NSKeyValueObservingOptionNew
context:nil];
}
最初のケースが機能しないのは、オブザーバーがプロキシオブジェクトの参照のメモリポインタを監視しているためであり、プロキシオブザーバーが追加された時点ではオブジェクトがないため、監視するものがないためだと思います。ただし、ウィジェットを初期化してそれを監視する場合、プロキシオブジェクトを割り当てると、aNewWidget
割り当て後にオブザーバーを追加しない限り、変更は監視されません(もちろん、オブジェクトの変更時にオブザーバーを削除する必要があります)。
aNewWidget
また、破壊された場合、このシナリオではどうなりますか?オブザーバーはプロキシ上にあるため、オブジェクトを破棄する前にオブザーバーを削除する必要がなくなりますか?(私はそうではないと思います)。
MyController
理想的には、プロキシにオブザーバーを設定し、クラスがなくなる場合を除いて、オブザーバーの追加と削除を心配することなく、プロキシオブジェクトに必要なウィジェット参照をスワップインおよびスワップアウトできるようにしたいと思います。Deallocでのオブザーバーの削除。
ヘルプ/コメント/アドバイスをいただければ幸いです。