2011-02-04 52 views
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中處理觀察者的移除。

任何幫助/意見/建議表示讚賞。

回答

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.Appreciate response。 – Hooligancat 2011-02-04 20:26:40