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

hyp*_*asm 7 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];
...
Run Code Online (Sandbox Code Playgroud)

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

[self removeObserver:self forKeyPath:@"aProperty"];
[self removeObserver:self forKeyPath:@"anotherProperty"];
...
Run Code Online (Sandbox Code Playgroud)

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

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

我只是想避免写一大堆

[self removeObserver:self forKeyPath ...]
Run Code Online (Sandbox Code Playgroud)

在我的-dealloc方法中.

Sve*_*ven 5

你可能可以在不self作为观察者移除的情况下离开,但你不应该.你addObserver:...去哪里也需要做removeObserver:....

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

  • 感谢您的答复.我的班级有很多属性,只要其中任何一个发生变化,都需要触发一个事件,所以我认为使用KVO和@synthesized setter比写一个bazillion setter更方便. (3认同)
  • 快速说明,有正当理由观察自我,例如观察超类的只读属性(例如,当子类化NSNotification时).也可能存在KVO更新,这些更新不是由setter触发的(但是由will/didChangeValueForKey:在setter之外) (2认同)