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

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

在标题中:

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

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

有帮助吗?

解决方案

keyPath 必须符合 KVC。所以这是代码:

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

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

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

请检查我的编辑。我已将分配更改为保留。也许这对你来说更好。您应该尝试选择最适合您的。我只是想说这在KVO中并不重要。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top