2016-09-23 32 views
4

在阅读了iOS 9的this后,我知道你不需要删除Observer了。为什么你必须删除ios8中的观察者?

但是对于iOS 8,您neededremoveObserver中的viewController的deinit方法。 但我无法理解它。如果viewController被释放,那么它的DEAD不是?为什么我们需要做一个removeObserver。它是一个观察者,就像呼唤一个永远不会拿起手机的死者一样

我不理解什么?

+3

因为发送消息到释放实例会崩溃应用程序... –

回答

9

这是你链接的文章中充分说明:

通知中心现在保持一个零参考观察者:

如果观察者能够被存储为归零弱引用底层存储将存储观察者作为归零弱引用,或者如果对象不能被弱存储(即它有一个自定义的保留/释放机制,将阻止运行库弱存储该对象),它会将对象存储为一个非弱的调零参考。

此前的iOS 9,NSNotificationCenter没有使用weak参考,因此NSNotificationCenter不知道目标已经实现释放。它盲目地将通知发送给任何已注册的目标。如果目标已被释放,这很糟糕(可能会崩溃)。因此需要始终取消注册。

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

4

它作为一个观察者很像调用一个死去的人谁不会拿起电话

没错!

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

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

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