在可可中观察自我

发布于 2024-08-01 13:14:47 字数 245 浏览 4 评论 0原文

在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

将军与妓 2024-08-08 13:14:48

不要删除 -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 2024-08-08 13:14:48

我按照布莱恩·韦伯斯特说的去做。 这是一个例子:

//.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
}
...

I do what Brian Webster said. Here's an example:

//.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
}
...
素年丶 2024-08-08 13:14:47

是的,你没有任何理由不能观察自我。 但就像你说的,就像任何 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文