KVO 的添加和删除观察者方法——计数还是幂等?

KVO's add & remove observer methods – counted or idempotent?

KVO 我订阅了接收来自潜在发件人的更改通知:

[potentialSender addObserver: self 
                  forKeyPath: NSStringFromSelector(@selector(aProperty))
                     options: 0
                     context: myKVOHandle];

我可以退订:

[potentialSender removeObserver: self
                     forKeyPath: NSStringFromSelector(@selector(aProperty))
                        context: myKVOHandle];

可以使用 创建 KVO 句柄。

是否像这样的调用 计数 – 所以每个 add 必须直接配对并在 remove 之前 – 这就像 pre-ARC retainrelease

或者,它们是 idempotent – 任意数量的 add 调用都可以被单个 remove、多个 remove 没有匹配的操作 add 是安全的吗?


我相信幂等方法用于 [aControl addTarget:action:forControlEvents:] [aNotificationCentre addObserver:selector:name:object:]。我对通知中心 addObserver 电话的看法是错误的。它们不是幂等的。但是,删除是。感谢 Rob 纠正我的错误。

KVO 调用必须平衡。每个 addObserver:... 必须与等价的 removeObserver:... 相平衡。 "unsubscribe all" 没有像 NSNotificationCenter 那样的机制。不平衡添加的删除是错误的。 KVO很挑剔。

注意NSNotificationCenter绝对不是幂等的。多个相同的 addObserver:... 调用将导致多个通知。可以做一个全局 removeObserver:self 而不平衡每个 addObserver:...,并且在没有添加时删除是安全的。