我應該能夠在代理對象上設置觀察者,更改代理對象指向的內容並仍然能夠觀察實際對象上的更改嗎?使用代理對象的觀察對象
一個例子可能解釋這一點最好。考慮以下。
在標題:
@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中處理觀察者的移除。
任何幫助/意見/建議表示讚賞。
@Infinty - Awesome.Appreciate response。 – Hooligancat 2011-02-04 20:26:40