16

我们是否必须removeObserver:显式发送已作为观察者添加到NSNotificationCenter之前的对象?

我有点困惑,无法找到确切的答案。

请详细告诉我,包括为什么我们需要显式删除观察者,以及为什么编译器不将它隐式地放在类/应用程序中?

4

4 回答 4

13

是的,您需要调用removeObserver:,如果您不这样做,被观察的类可以调用观察者的所有已释放实例。

于 2012-12-17T09:46:15.213 回答
8

从 10.11 开始,观察者不需要在他们的释放方法中取消注册。

NSNotificationCenter 和 NSDistributedNotificationCenter 不再向可能被释放的注册观察者发送通知。如果观察者能够存储为调零弱引用,则底层存储将观察者存储为调零弱引用。或者,如果对象不能被弱存储(因为它有一个自定义的保留/释放机制会阻止运行时能够弱存储该对象),则该对象被存储为非弱归零引用。这意味着观察者不需要在他们的释放方法中取消注册。[1]

于 2015-10-01T14:04:51.170 回答
5

移除观察者总是一个聪明的主意。如果你不移除观察者,消息仍然会被发送,即使对象被释放。甚至可能附着在另一个物体上,这肯定会导致严重的麻烦。

于 2012-12-17T09:46:55.350 回答
2

您总是需要删除 KVO 和通知的观察者。

于 2012-12-17T09:54:58.960 回答