将观察者添加到自身或对象中有什么区别?
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
)。第二种方法更健壮,并且向前兼容与被监视生命周期相关的任何未来变化 属性.
我想知道将观察者添加到自身或对象中有什么不同。到目前为止,它们对 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
)。第二种方法更健壮,并且向前兼容与被监视生命周期相关的任何未来变化 属性.