当使用KVO时,有必要在-dealloc中删除自我作为自我的观察者吗?

时间:2011-06-06 17:30:24

标签: objective-c key-value-observing

在我的NSObject子类的-init方法中,实例将自身添加为一些自己的keyPath的观察者,以便触发一个应该在其中一个属性发生更改时发生的操作。例如

[self addObserver:self forKeyPath:@"aProperty" options:0 context:nil];
[self addObserver:self forKeyPath:@"anotherProperty" options:0 context:nil];
...

我的问题是,在类的-dealloc方法中,我是否一定需要删除实例作为自身的观察者?例如

[self removeObserver:self forKeyPath:@"aProperty"];
[self removeObserver:self forKeyPath:@"anotherProperty"];
...

我认为,当一个对象试图向一个不再存在的对象发送消息时,会抛出一个异常,这显然是一个问题。但在这种情况下,一个不再存在的对象不可能向自己发送消息,所以这应该不是问题。

我还没有遇到任何问题,但它仍然有点困扰我,因为我从未见过它明确表示你可以这样做。

我只是想避免写一大堆

[self removeObserver:self forKeyPath ...]

在我的-dealloc方法中。

1 个答案:

答案 0 :(得分:5)

你可能会在不删除self作为观察者的情况下逃脱,但你不应该这样做。如果您addObserver:...,您还必须稍后removeObserver:...

但是这个讨论无论如何都是无关紧要的,因为没有必要观察self,只是在你的财产的设定者中触发你的行动。这导致更清晰,更易读的代码实际上表现更好。