【发布时间】:2011-08-12 13:25:24
【问题描述】:
我刚刚阅读了一些关于 KVO 的教程,但我还没有发现它存在的原因。 NSNotificationCenter 不是更容易观察对象吗?
我是 Stackoverflow 的新手,所以如果我问这个问题的方式有问题,请告诉我!
【问题讨论】:
标签: objective-c key-value-observing nsnotificationcenter
我刚刚阅读了一些关于 KVO 的教程,但我还没有发现它存在的原因。 NSNotificationCenter 不是更容易观察对象吗?
我是 Stackoverflow 的新手,所以如果我问这个问题的方式有问题,请告诉我!
【问题讨论】:
标签: objective-c key-value-observing nsnotificationcenter
通知和 KVO 提供类似的功能,但权衡不同。
通知易于理解。 KVO 是...具有挑战性...理解(至少要理解如何使用它很好)。
通知需要修改观察到的代码。观察者必须明确生成它提供的每个通知。只要观察到的代码符合 KVC(无论如何都应该),KVO 对观察到的代码是透明的。
即使您不使用通知也会产生开销。每次观察到的代码发布通知时,都必须针对系统中的每个观察结果进行检查,即使没有人观察该对象(即使没有人观察任何东西)。如果系统中有超过几百个观测值,这可能非常重要。如果有几千个,这可能是一个严重的问题。 KVO 对任何实际未观察到的对象的开销为零。
一般来说,我不鼓励 KVO,因为我认为某些特定的实现问题会使其难以正确使用。如果没有您的超类的特殊知识,很难观察到您的超类也观察到的对象。它对字符串文字的严重依赖使得在编译时很难发现小的错别字。一般来说,我发现严重依赖它的代码变得复杂且难以阅读,并且开始出现令人毛骨悚然的远距离动作错误。 NSNotification 代码往往更直接,你可以看到发生了什么。随机代码不会在您意料之外的时候运行。
话虽如此,KVO 是一项重要功能,开发人员需要了解它。越来越多的低级对象依赖它,因为它具有零开销的优势。但对于新开发人员,我通常建议他们更多地依赖通知而不是 KVO。
还有第三种方法。您可以保留一个侦听器列表,并在事情发生变化时向他们发送消息,就像委托方法一样。有些人称这些为“多播委托”,但“侦听器”在这里更正确,因为它们不会像委托那样修改对象的行为。如果您需要在系统中进行大量观察,那么这样做可以比NSNotification 快得多,而且不会增加 KVO 的复杂性。
【讨论】: