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

时间:2016-09-23 15:04:03

标签: ios swift ios8 nsnotificationcenter

在阅读了适用于iOS 9的this帖后,我知道您不再需要删除Observer。

但是对于iOS 8,您在viewController的deinit方法中{em} {em> removeObserver 。 但我无法理解它。如果一个viewController被释放,那么它的DEAD不是吗?为什么我们需要做一个removeObserver。它是一个观察者就像打电话给一个永远不会拿起电话的死人一样

我不理解什么?

2 个答案:

答案 0 :(得分:10)

您在链接的文章中对此进行了详细解释:

  

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

     

如果观察者能够存储为归零弱引用,则底层存储将把观察者存储为归零弱引用,或者如果对象不能被弱存储(即它具有自定义保留/释放机制,那么防止运行时能够以弱方式存储对象)它会将对象存储为非弱的归零引用。

在iOS 9之前,使用NSNotificationCenter引用未实现weak,因此NSNotificationCenter不知道目标已被解除分配。它盲目地向任何已注册的目标发送通知。如果目标已被解除分配,这很糟糕(可能会崩溃)。因此需要始终取消注册。

在iOS 9中,NSNotificationCenter开始使用弱引用。这意味着它现在知道其中一个已注册的目标是否已被解除分配。这意味着它不再尝试向解除分配的目标发送通知。这意味着您不再需要在取消分配之前显式取消注册目标。

答案 1 :(得分:4)

  

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

完全!

在这种情况下,您的电话号码是一个内存地址,一旦通知中心尝试呼叫观察者,该地址将被取消引用。现在,一旦View Controller被解除分配,您对该内存地址的期望是什么?我们无法知道。

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

添加一个真实世界的例子:它更像是依靠您的汽车(视图控制器)位于车库中的特定位置(内存地址)。你绝对依赖你的车在那里,所以当你想进入时,你甚至不知道它是否在那里。现在,假装有人拆除(取消分配)你的车,但你仍然依赖它在那里。进入并坐在不再存在的汽车中肯定是一种痛苦的经历。