【问题标题】:What is the difference between adding the observer to self or to the object?将观察者添加到自身或对象有什么区别?
【发布时间】:2020-11-16 13:20:31
【问题描述】:

我想知道如果我将观察者添加到自身或对象中的区别。到目前为止,它们对 KVO 的效果相同。

class Human: NSObject {
    @objc dynamic var name: String = "name"
}

class SomeClass: UIViewController {
    @objc var human = Human()

    ...
    override func viewDidLoad() {
     ...

     human.addObserver(self, forKeyPath: #keyPath(Human.name), options: [.old, .new], context: nil)

     addObserver(self, forKeyPath: #keyPath(human.name), options: [.old, .new], context: nil)
}

如果我使用removeObserver(self) 或human.removeObserver(self) 删除观察者也是一样的吗?

感谢您对这个问题的回答。敬请期待!

【问题讨论】:

  • 如果您在代码中的其他地方使用self.human = Human(),我认为第一个示例将停止工作,但第二个则不会。不过我自己没有测试过。
  • 明白了!谢谢@JoakimDanielson

标签: ios swift key-value-observing


【解决方案1】:

human.addObserver(#keyPath(Human.name)) 将观察者附加到 human 属性当时的值。正如 Joakim 所指出的,如果属性的值发生变化,那么观察者将继续观察过时的值。如果之前的值被解除分配,你可能会因为对象被解除分配而导致严重的崩溃,而观察者被附加到它。

addObserver(#keyPath(human.name)) 不会受到其他方法的缺陷的影响,并且是向观察者注册的推荐方法,以防您希望更改 human 属性。有一个很小的性能损失,因为 Cocoa 还必须拦截 human 属性的设置器,但它并不明显。

总而言之,仅当您 100% 确定该属性不会随时间而变化时才使用第一种方法(即,它被声明为 let 并且您不希望将来有任何代码更改使其成为var)。第二种方法更健壮,并且与被监视属性的生命周期相关的任何未来更改向前兼容。

【讨论】:

  • 太棒了!感谢您的回答!
猜你喜欢
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
相关资源
最近更新 更多