我们是否必须removeObserver:
显式发送已作为观察者添加到NSNotificationCenter
之前的对象?
我有点困惑,无法找到确切的答案。
请详细告诉我,包括为什么我们需要显式删除观察者,以及为什么编译器不将它隐式地放在类/应用程序中?
我们是否必须removeObserver:
显式发送已作为观察者添加到NSNotificationCenter
之前的对象?
我有点困惑,无法找到确切的答案。
请详细告诉我,包括为什么我们需要显式删除观察者,以及为什么编译器不将它隐式地放在类/应用程序中?
是的,您需要调用removeObserver:
,如果您不这样做,被观察的类可以调用观察者的所有已释放实例。
从 10.11 开始,观察者不需要在他们的释放方法中取消注册。
NSNotificationCenter 和 NSDistributedNotificationCenter 不再向可能被释放的注册观察者发送通知。如果观察者能够存储为调零弱引用,则底层存储将观察者存储为调零弱引用。或者,如果对象不能被弱存储(因为它有一个自定义的保留/释放机制会阻止运行时能够弱存储该对象),则该对象被存储为非弱归零引用。这意味着观察者不需要在他们的释放方法中取消注册。[1]
移除观察者总是一个聪明的主意。如果你不移除观察者,消息仍然会被发送,即使对象被释放。甚至可能附着在另一个物体上,这肯定会导致严重的麻烦。
您总是需要删除 KVO 和通知的观察者。