将观察者添加到自身或对象中有什么区别?

What is the difference between adding the observer to self or to the object?

我想知道将观察者添加到自身或对象中有什么不同。到目前为止,它们对 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) 删除观察者是否也一样?

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

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

addObserver(#keyPath(human.name)) 没有其他方法的缺陷,并且是推荐的注册观察者的方法,以防您期望 human 属性 发生变化。有一个很小的性能损失,因为 Cocoa 还必须拦截 human 属性 的 setter,但它不明显。

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