为什么你必须删除ios8中的观察者?

阅读这篇文章的iOS 9后,我知道你不需要removeObserver了。

但是对于iOS 8,您需要在viewControllerdeinit方法中删除Observer。 但我无法理解它。 如果一个viewController被释放,那么它的DEAD不是? 为什么我们需要做一个removeObserver。 这是一个观察者,就像打电话给一个永远不会接电话的死人一样

我不了解什么?

在你链接的文章中有充分的解释:

通知中心现在保持对观察者的归零参考:

如果观察者能够被存储为零弱引用,则底层存储将把观察者存储为一个归零弱引用,或者如果该对象不能被弱存储(即,它具有定制的保留/释放机制,这将阻止运行时从弱存储对象)它将存储对象作为一个非弱的归零引用。

在iOS 9之前, NSNotificationCenter没有使用weak引用来实现,所以NSNotificationCenter不知道目标已经被释放。 它盲目地发送通知给任何已经注册的目标。 如果目标已经被释放,这是不好的(可能崩溃)。 因此需要始终取消注册。

在iOS 9中, NSNotificationCenter开始使用弱引用。 这意味着它现在知道是否有一个注册目标已经被释放。 这意味着它不再尝试发送通知到释放的目标。 这意味着您不再需要在释放目标之前明确注销目标。

这是一个观察者,就像打电话给一个永远不会接电话的死人一样

究竟!

在这种情况下,您的电话号码是一个内存地址,一旦通知中心尝试呼叫观察员,该内存地址将被解除引用。 现在,一旦视图控制器被释放,你期望在这个内存地址上有什么? 我们不知道。

但是你肯定不想调用一个方法(这就是通知中心所做的),这个方法可能不再存在,甚至已经被完全不同的东西(例如图像)所取代。

添加一个真实世界的例子:更像是依靠你的车(视图控制器)在车库的特定位置(内存地址)。 你绝对依靠你的车去那里,所以当你想进去的时候,你甚至不会去看它是否在那里。现在,假装有人把你的车取出(释放),但是你仍然依靠它。 进入并坐在不在那里的汽车肯定是一个痛苦的经历。