在 Cocoa 中,addObserver:forKeyPath:options:context:
保留“既不是接收者,也不是观察者”。因此,我假设允许观察自我;也就是说,做类似的事情是完全有效的
[self addObserver:self forKeyPath...]
只要你记得self
在 dealloc 中首先取消注册为观察者。
这个假设正确吗?
在 Cocoa 中,addObserver:forKeyPath:options:context:
保留“既不是接收者,也不是观察者”。因此,我假设允许观察自我;也就是说,做类似的事情是完全有效的
[self addObserver:self forKeyPath...]
只要你记得self
在 dealloc 中首先取消注册为观察者。
这个假设正确吗?
是的,没有任何理由你不能观察自我。但就像你说的,就像任何 KVO 观察一样,确保在解除分配之前将自己作为观察者移除。
作为记录,如果您只是在谈论一个简单的键,另一种方法是编写自定义设置器并在设置器中执行您需要的任何代码。这种风格使调用 setter 的全部效果更加明显。不过,KVO 方式更灵活一些,并且适用于包含多个组件的关键路径。
我按照布赖恩韦伯斯特所说的去做。这是一个例子:
//.h
...
@property(readwrite, retain, setter=setMyPropertySynth:) id myProperty;
-(void)setMyProperty:(id)newValue;
....
//.m
...
@synthesize myProperty;
-(void)setMyProperty:(id)newValue
{
//add code here
[self setMyPropertySynth:newValue];
//add more code here
}
...
不要删除-dealloc
. 为什么?因为当您打开垃圾收集器时,事情将停止工作;-dealloc
永远不会被调用。您应该只对与内存相关的清理代码使用-dealloc
和-finalize
方法。