在可可中观察自我
在 Cocoa 中,addObserver:forKeyPath:options:context: 保留“既不是接收者,也不是观察者”。 因此我认为观察自我是允许的; 也就是说,执行诸如
[self addObserver:self forKeyPath...]
之类的操作是完全有效的,只要您记得将 self
注册为观察者作为第一件事解除分配。
这个假设正确吗?
In Cocoa, addObserver:forKeyPath:options:context:
retains "neither the receiver, nor anObserver". Therefore I assume observing self is allowed; that is, it's perfectly valid to do something like
[self addObserver:self forKeyPath...]
As long as you remember to unregister self
as an observer as the first thing in dealloc.
Is this assumption correct?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
不要删除
-dealloc
中的观察者。 为什么? 因为当你打开垃圾收集器时,事情就会停止工作;-dealloc
永远不会被调用。 您应该只使用-dealloc
和-finalize
方法来执行内存相关清理代码。Don't remove an observer in
-dealloc
. Why? Because when you turn on the garbage collector things will stop working;-dealloc
never gets called. You should just use the-dealloc
and-finalize
methods for memory-related cleanup code.我按照布莱恩·韦伯斯特说的去做。 这是一个例子:
I do what Brian Webster said. Here's an example:
是的,你没有任何理由不能观察自我。 但就像你说的,就像任何 KVO 观察一样,请确保在释放之前将自己作为观察者删除。
作为记录,如果您只是谈论一个简单的键,则执行此操作的另一种方法是编写自定义设置器并执行设置器中所需的任何代码。 这种风格使得调用 setter 的全部效果更加明显。 不过,KVO 方式更加灵活,并且适用于包含多个组件的关键路径。
Yes, there is not really any reason you can't observe self. But like you said, like any KVO observation, make sure to remove yourself as an observer before being dealloced.
For the record, one alternate way of doing this if you're just talking about a simple key is to write a custom setter and execute whatever code you need in the setter. This style makes it a little more obvious what the full effects of calling the setter are. The KVO way is a bit more flexible though, and works with key paths that contain multiple components.