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

Ano*_*dya 16 cocoa objective-c nsnotificationcenter automatic-ref-counting

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

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

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

rck*_*nes 13

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

  • 当然,NSNotificationCenter知道谁在观察:毕竟,它必须转发通知.看起来他们可以使用归零弱引用来确保通知不会被发送给释放的观察者.但我做了一个快速演示只是为了仔细检查,如果你不在dealloc中调用removeObserver:它会崩溃.荡. (7认同)
  • 那么为什么ARC不采取预防措施呢?就像它放了[...发布]; 为什么它不放[... removeObserver:...]?/ (2认同)

Par*_*fna 7

从10.11开始,观察员不需要在其解除分配方法中取消注册.

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

  • 这显然也适用于 iOS9(但不是 iOS8)。参考:http://useyourloaf.com/blog/unregistering-nsnotificationcenter-observers-in-ios-9/ (2认同)

NSA*_*ict 5

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