在阅读了适用于iOS 9的this帖后,我知道您不再需要删除Observer。
但是对于iOS 8,您在viewController的deinit
方法中{em} {em> removeObserver 。
但我无法理解它。如果一个viewController被释放,那么它的DEAD不是吗?为什么我们需要做一个removeObserver。它是一个观察者就像打电话给一个永远不会拿起电话的死人一样
我不理解什么?
答案 0 :(得分:10)
您在链接的文章中对此进行了详细解释:
通知中心现在保持对观察者的归零引用:
如果观察者能够存储为归零弱引用,则底层存储将把观察者存储为归零弱引用,或者如果对象不能被弱存储(即它具有自定义保留/释放机制,那么防止运行时能够以弱方式存储对象)它会将对象存储为非弱的归零引用。
在iOS 9之前,使用NSNotificationCenter
引用未实现weak
,因此NSNotificationCenter
不知道目标已被解除分配。它盲目地向任何已注册的目标发送通知。如果目标已被解除分配,这很糟糕(可能会崩溃)。因此需要始终取消注册。
在iOS 9中,NSNotificationCenter
开始使用弱引用。这意味着它现在知道其中一个已注册的目标是否已被解除分配。这意味着它不再尝试向解除分配的目标发送通知。这意味着您不再需要在取消分配之前显式取消注册目标。
答案 1 :(得分:4)
它是一个观察者,就像打电话给一个永远不会拿起电话的死人一样
完全!
在这种情况下,您的电话号码是一个内存地址,一旦通知中心尝试呼叫观察者,该地址将被取消引用。现在,一旦View Controller被解除分配,您对该内存地址的期望是什么?我们无法知道。
但你肯定不想在一个可能不再存在的对象上调用一个方法(这就是通知中心所做的),甚至已经被完全不同的东西(例如图像)所取代。
添加一个真实世界的例子:它更像是依靠您的汽车(视图控制器)位于车库中的特定位置(内存地址)。你绝对依赖你的车在那里,所以当你想进入时,你甚至不知道它是否在那里。现在,假装有人拆除(取消分配)你的车,但你仍然依赖它在那里。进入并坐在不再存在的汽车中肯定是一种痛苦的经历。