【问题标题】:Do observers need to be removed in Swift 4/Objective-C?在 Swift 4/Objective-C 中是否需要删除观察者?
【发布时间】:2018-02-10 15:10:15
【问题描述】:

我正在尝试在 Swift 4 中实现 KVC/KVO。我阅读过的关于 Objective-C 中 KVC/KVO 的大部分文档都指出,当你完成它时,需要删除观察者。但是,在查看了 Apple 使用 Swift 4 实现 KVO 的文档后,他们没有明确说明是否需要在 deinit 方法中删除观察者。它们不包括示例类定义中的 deinit 方法。但是,我不想做任何假设,因为我读过的所有 Objective-C 文档都指出需要删除观察者。

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html#//apple_ref/doc/uid/TP40014216-CH7-ID12

我只是不确定是否需要通过 deinit 删除观察者。任何帮助或指向参考方向都会很棒,谢谢。

【问题讨论】:

标签: objective-c cocoa swift4 key-value-observing


【解决方案1】:

如果你在谈论NSKeyValueObservation:不,他们没有。

来自WWDC 2017 Video "What is new in Foundation"的文字记录

我不需要deinit 来丢弃或拆除我的观察,因为它与该观察令牌的生命周期相关联。所以当控制器离开时,观察令牌也会消失。

【讨论】:

  • 期待不能形成弱引用的类...对于此类类,您仍然需要在 deinit 中删除观察。
【解决方案2】:

Foundation Release Notes 开始,关于注销观察者的规则在 10.13 中放宽了(强调):

宽松的键值观察注销要求

在 10.13 之前,如果在自动通知对象的 -dealloc 完成运行后仍有任何观察者注册,KVO 会抛出异常。此外,如果所有观察者都被删除,但在dealloc 期间从另一个线程中删除了一些观察者,则仍然会错误地抛出异常。此要求已在 10.13 中放宽,但需满足两个条件:

  • 对象必须使用 KVO 自动通知,而不是手动调用 -will-didChangeValueForKey:(即它不应从 +automaticallyNotifiesObserversForKey: 返回 NO)
  • 对象不得覆盖内部 KVO 状态的(私有)访问器

如果所有这些都为真,-dealloc 返回后的任何剩余观察者都将被 KVO 清理;这也比重复调用-removeObserver 方法更有效。

HTH

【讨论】:

    猜你喜欢
    • 2011-09-22
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多