KVO观察与NSNotificationCenter观察

时间:2011-09-20 01:15:25

标签: cocoa binding key-value-observing nsnotificationcenter nsnotification

我想知道在KVO和NSNotificationCenter观察中是否有理由使用其中一个。性能,内存使用,速度等?

2 个答案:

答案 0 :(得分:15)

这两者并不总是可以互换的。从概念上讲,KVO仅用于观察对象的属性。例如,您无法使用KVO替换NSApplicationWillTerminateNotification,因为它会通知观察者发生的事件,而不是对象属性的更改。

至于性能和内存使用情况,它们都很快并且使用的内存可以忽略不计。 NSNotificationQueue已合并以阻止通知泛滥。据我所知,KVO没有任何合并,这确实在一定程度上给我带来了性能问题。我正在观察数百个对象,当这些对象发生批量更新时,我会得到数百个KVO回调。这不是KVO本身的性能问题,而是由于批量更新而运行我自己的代码。

性能不是真正的问题,更多的是最适合这个问题。如果是属性更改,请使用KVO。如果不是属性更改,请使用委托或通知,具体取决于您是需要单个观察者还是多个观察者。

答案 1 :(得分:0)

一个非常古老的问题,但想到添加一些要点。我同意Tom Dalling's answer,但是,在大型应用程序中有许多场景,我们倾向于为对象的属性添加观察者,我们不能,或者,我们错过了将它们从观察者列表中删除。

让我们从我的应用程序中考虑以下场景 - ViewController显示一个蛇对象,我正在观察此对象的属性更改 - "毒液"。因此,每当viewController需要显示不同的蛇时,我只需从该蛇对象的观察者中删除视图控制器。

应用程序演变为显示蛇列表而不是单个蛇,这意味着我必须观察该对象中所有蛇的属性。现在,当从数组中删除一条旧蛇时,我应该了解这个事件,以便我可以从这个蛇对象中删除视图控制器作为观察者。为此,我必须首先观察数组本身的变化。要做到这一点,我必须遵循特定的协议将对象插入数组并从数组中删除它们。这样就增加了复杂性。我们都知道不从对象中删除观察者的后果以及操作系统是否释放该对象!

上面只是一个引用的例子,这里的主要问题是我无法获取给定对象的KVO观察者列表,以便在此对象释放之前将其从观察者中删除 - 这很容易由NSNotification和NSNotificationCenter实现。有时,我倾向于使用NSNotification而不是KVO,但是,KVO在良好的设计实践方面总是优于通知。