Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 使用代理对象观察对象_Cocoa_Key Value Observing_Addobserver_Proxy Object - Fatal编程技术网

Cocoa 使用代理对象观察对象

Cocoa 使用代理对象观察对象,cocoa,key-value-observing,addobserver,proxy-object,Cocoa,Key Value Observing,Addobserver,Proxy Object,我应该能够在代理对象上设置观察者,更改代理对象指向的对象,并且仍然能够观察真实对象上的更改吗 举个例子可以最好地解释这一点。请考虑以下内容: 在标题中: @interface MyController : NSObject { MyWidgetModel * aProxyObject; } 在初始化或从NIB唤醒方法中: -(void)awakeFromNib { // Init the proxy object. Could be as an empty widget

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

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

在标题中:

@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;

}
这不会触发
anewidget
中的任何更改。但是,如果我将
addObserver
移动到分配之后,如下所示,它会工作:

-(void)changeWidget:(MyWidgetModel *)aNewWidget {

   [aProxyObject removeObserver:self forKeyPath:@"widgetName"];

   aProxyObject = aNewWidget;

   [aProxyObject addObserver:self 
                  forKeyPath:@"widgetName"
                     options:NSKeyValueObservingOptionNew 
                     context:nil];
}
我假设第一种情况不起作用是因为观察者正在观察代理对象引用的内存指针,并且在添加代理观察者时没有对象,因此没有任何东西需要观察。但是,如果我初始化一个小部件并观察到这一点,那么分配代理对象
aNewWidget
,它仍然不会观察到更改,除非我在分配之后添加观察者(当然需要在对象更改时删除观察者)

另外,如果
anewidget
被销毁,在这种情况下会发生什么?因为观察者在代理上,这是否意味着不需要在销毁对象之前删除观察者?(我想不会的)

理想情况下,我希望能够在代理上设置观察者,并交换我想要的代理对象的任何小部件引用,而不必担心添加和删除观察者,除非
MyController
类消失,在这种情况下,我可以在dealloc中处理观察者的删除


欢迎提供任何帮助/意见/建议。

密钥路径必须符合KVC。下面是代码:

@interface MyController : NSObject {   
  MyWidgetModel * aProxyObject;
}
@property (nonatomic, retain) MyWidgetModel * aProxyObject;
不要忘记在实现文件中对其进行合成。然后使用以下代码添加观察者:

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


请检查我的编辑。我已将分配更改为保留。也许这对你更好。你应该试着为自己选择最好的。我只想说,这在KVO中并不重要。

@Infinty-太棒了。感谢您的回复。