【问题标题】:Observing object using proxy object使用代理对象观察对象
【发布时间】:2026-01-16 14:10:02
【问题描述】:

我是否应该能够在代理对象上设置观察者,更改代理对象指向的内容,并且仍然能够观察真实对象上的更改?

一个例子可以最好地解释这一点。请考虑以下内容。

在标题中:

@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 中处理观察者的移除。

任何帮助/cmets/建议表示赞赏。

【问题讨论】:

    标签: cocoa key-value-observing addobserver proxy-object


    【解决方案1】:

    keyPath 必须符合 KVC。代码如下:

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

    不要忘记在实现文件中合成它。然后使用这段代码添加观察者:

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

    请检查我的编辑。我已将分配更改为保留。也许它对你更好。你应该尽量选择最适合你的。我只想说在KVO中没关系。

    【讨论】:

    • @Infinty - 很棒。感谢您的回复。