2011-02-04 13 views
0

プロキシオブジェクトにオブザーバを設定し、プロキシオブジェクトが指しているものを変更しても、実際のオブジェクトの変更を観察できるはずですか?プロキシオブジェクトを使用してオブジェクトを観測する

この例では、この例をよく説明しています。以下を考慮する。ヘッダで

: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でオブザーバの削除を処理できます。

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

答えて

0

keyPathはKVC準拠でなければなりません。コードは次のとおりです。

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

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

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

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

+0

@Infinty-Awesome.Response the response。 – Hooligancat

関連する問題