在ARC中我们需要发送removeObserver:explicit吗?

时间:2012-12-17 09:43:42

标签: objective-c cocoa automatic-ref-counting nsnotificationcenter

我们是否必须明确地将removeObserver:发送给之前作为观察者添加到NSNotificationCenter的对象?

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

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

4 个答案:

答案 0 :(得分:13)

是的,你需要调用removeObserver:,如果你没有,观察到的类可以调用观察者的所有解除分配的实例。

答案 1 :(得分:7)

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

  

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

答案 2 :(得分:5)

删除观察者总是一个明智的想法。 如果不删除观察者,即使对象已取消分配,仍会发送消息。它甚至可能附着在另一个物体上,这肯定会导致严重的麻烦。

答案 3 :(得分:2)

您始终需要删除KVO和通知的观察者。