【问题标题】:iOS right way to remove observeriOS移除观察者的正确方法
【发布时间】:2014-04-22 16:01:49
【问题描述】:

我每次都使用 dealloc 来删除观察者,但只是遇到了这个link,它描述了我们可以使用 viewWillDisapper 而不是 dealloc。

【问题讨论】:

    标签: ios nsnotificationcenter


    【解决方案1】:

    选择是正确配对addObserver/removeObserver 调用。

    如果你在一个被调用过的地方调用addObserver,比如一些init方法或viewDidLoad,那么在dealloc中调用removeObserver

    如果您在像viewWillAppear 这样被多次调用的地方调用addObserver,则在viewWillDisappear 中调用removeObserver

    重要的是正确的配对。

    【讨论】:

    • 谢谢你的回答我知道观察者是如何工作的,他们是如何工作的,这取决于我需要的逻辑,但我认为在 viewWillDisappear 中使用它并不好,因为内存使用情况,我也是可以添加例如 IBAction,它将隐藏例如视图,然后也删除观察者 =) 或任何其他疯狂的想法)
    • 我不知道您为什么认为在删除 viewWillDisappear 中的观察者时存在内存问题。正如我所说,如果您从viewWillAppear 调用addObserver,则只能从viewWillDisappear 调用removeObserver。如果这不能满足您的需求,则不要在这两种方法中设置/删除观察者。使用适合您需要的任何一对。
    • 所以,没关系)我只是想听听建议,所有答案都很好。我想我很困惑。
    • 我刚刚编辑了删除“相当肯定”行的问题)谢谢
    【解决方案2】:

    关于 KVO 的一个关键点是您必须匹配 removeObserve 和 addObserver 调用,并且不能添加重复的观察者。这意味着您必须仔细考虑在哪里添加观察者以及在哪里删除它,以免违反这些限制。

    如果您在 viewDidLoad 中添加它,目前在 dealloc 中删除它就足够了(因为不再使用 viewDidUnload),但是当视图不可见时观察者可能会触发。如果您在仍然调用 viewDidUnload 的旧操作系统上运行,这也可能会出现问题,因为您必须跟踪观察者何时到位以及何时不到位。

    您可以在 viewDid/WillAppear 中添加它,在这种情况下您需要在 viewDid/WillDisappear 中将其移除。这通常更简洁,因为(通常)保证调用是匹配的。

    【讨论】:

      【解决方案3】:

      您引用的链接内容相对丰富且准确。

      我是这样想的:

      a) VC 只在屏幕上显示时需要得到通知吗?使用 viewWillAppear/viewWillDisappear。

      b)只要 VC 还活着(但不一定在屏幕上),是否需要通知它?使用 init 或 viewDidLoad 并在 dealloc 中删除。

      我在 ARC 下为我的 dealloc 方法设置了断点,它们会在预期的时候被调用。但是 viewDidUnload 没有被调用。

      【讨论】:

      • 是的,我明白了,老实说,我从来没有遇到过视图关闭且控制器仍在内存中的情况。我认为如果我们需要一些我们不使用的视图的控制器,这对内存使用不利。通常当视图关闭时,控制器也会被删除,因为我需要的一切都在数据模型中,我可以在需要时再次恢复它。所以也许这意味着如果我们在 viewWillDisappear 中删除观察者,那么我们的内存使用逻辑就不准确了。
      • @MatrosovAlexander,如果您进行任何推送或模态演示,那么您将拥有仍在内存中的控制器(您从中推送的控制器或呈现视图控制器),但它们的视图将不在屏幕上 - - 这其实是很常见的情况。
      • 是的,我明白了,但无论如何都不好,如果我多次推送某些控制器,我认为会导致我的应用程序崩溃
      • 所以我认为在任何情况下答案都有正确的逻辑,因为每个程序员都有责任如何制作架构。因此,它应该取决于您需要的逻辑而不是规则,例如使用 dealloc
      • 所以,没关系)我只是想听听建议,所有答案都很好。我想我很困惑。
      猜你喜欢
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多