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