当前位置: 首页 > 面试题库 >

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

曹浩淼
2023-03-14
问题内容

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

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

我不明白什么?


问题答案:

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

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

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

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

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



 类似资料:
  • 根据我在文档中的理解,每次实例化ViewModel的视图(使用前面的代码)被破坏时,我都应该删除观察者,对吗?但是,一旦视图被销毁(因为ViewModel实例在视图中被实例化,也将被销毁),观察者不应该被销毁吗?

  • 问题内容: 由于和不可用,我应该在哪里删除Swift 中的观察器? 问题答案: 使用以下方法,其功能与相同。 在取消释放类实例之前,将调用反初始化器。您使用deinit关键字编写反初始化器,类似于使用init关键字编写初始化器。反初始化器仅在类类型上可用。 迅捷反初始化器

  • 我有一个Observable类,它在字符串变化时通知observer。在观察者的update方法中,更新的字符串可以打印到控制台。但是GUI没有相应的更新。为什么?

  • 如何在收到第一个结果后移除观察者?下面是我尝试过的两种代码方式,但它们都不断接收更新,即使我已经删除了观察者。

  • 观察者模式是定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。