一尘不染

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

swift

阅读针对iOS 9的这篇文章后,我知道您不再需要removeObserver。

然而,对于iOS 8的,你需要removeObserver
deinit中的viewController的方法。但我无法理解。如果一个viewController被释放,那么它的DEAD不是吗?为什么我们需要做一个removeObserver。作为观察员就像打电话给永远不会接电话的死者一样

我不明白什么?


阅读 218

收藏
2020-07-07

共1个答案

一尘不染

您链接的文章已对此进行了详细说明:

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

如果观察者能够存储为弱归零引用,则底层存储会将观察者存储为弱归零引用,或者如果对象不能弱存储(即,它具有自定义的保留/释放机制会阻止运行时)
(因为能够弱地存储对象)将其存储为非弱的清零参考。

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

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

2020-07-07