プロキシオブジェクトにオブザーバを設定し、プロキシオブジェクトが指しているものを変更しても、実際のオブジェクトの変更を観察できるはずですか?プロキシオブジェクトを使用してオブジェクトを観測する
この例では、この例をよく説明しています。以下を考慮する。ヘッダで
:NIB法から初期化またはアウェイクで
@interface MyController : NSObject {
MyWidgetModel * aProxyObject;
}
:
-(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でオブザーバの削除を処理できます。
ヘルプ/コメント/アドバイスをいただければ幸いです。
@Infinty-Awesome.Response the response。 – Hooligancat