0

プロキシオブジェクトにオブザーバーを設定し、プロキシオブジェクトが指しているものを変更しても、実際のオブジェクトの変更を監視できるようにする必要がありますか?

例がこれを最もよく説明するかもしれません。次のことを考慮してください。

ヘッダー内:

@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でのオブザーバーの削除。

ヘルプ/コメント/アドバイスをいただければ幸いです。

4

1 に答える 1

0

keyPathはKVCに準拠している必要があります。コードは次のとおりです。

@interface MyController : NSObject {   
  MyWidgetModel * aProxyObject;
}
@property (nonatomic, retain) MyWidgetModel * aProxyObject;

実装ファイルで合成することを忘れないでください。次に、このコードを使用してオブザーバーを追加します。

[self addObserver:self 
            forKeyPath:@"aProxyObject"
               options:NSKeyValueObservingOptionNew 
               context:nil];

私の編集を確認してください。保持するように割り当てを変更しました。多分それはあなたにとってより良いです。あなたはあなたに最適なものを選ぶように努めるべきです。KVOでは問題ではないと言いたいだけです。

于 2011-02-04T19:15:01.370 に答える