Delegate、NSNotification、KVO该如何选择?

  • Delegate:

    1.Delegate本质是一种程序设计模型,iOS中使用Delegate主要用于两个页面之间的数据传递。iphone中常用@protocol和delegate的机制来实现接口的功能。例如想在A的功能要在B中实现,可以在A中定义一个Protocol。

    2.delegate方法往往需要关注返回值, 也就是delegate方法的结果。比如-windowShouldClose:,需要关心返回的是yes还是no。所以delegate方法往往包含 should这个很传神的词。也就是好比你做我的delegate,我会问你我想关闭窗口你愿意吗?你需要给我一个答案,我根据你的答案来决定如何做下一 步。

    3.delegate只是一对一,而NSNotification、KVO可以一对多,两者都没有返回值。

    4.delegate方法更直接,方法往往目的性很强。

    5.Delegate方法有@optional和required两个属性,限制委托方必须实现哪些方法。

  • NSNotification:

    1.NSNotification的特点,就是需要被观察者先主动发出通知,然后观察者注册监听后再来进行响应,比KVO多了发送通知的一步,但是其优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用也更灵活。

    2.休息相反的,notification最大的特色就是不关心接受者的态度, 我只管把通告放出来,你接受不接受就是你的事情,同时我也不关心结果。所以notification往往用did这个词汇,比如 NSWindowDidResizeNotification,那么nswindow对象放出这个notification后就什么都不管了也不会等待接 受者的反应。

    3.一对多

    4.特点:就是需要被观察者先主动发出通知,然后观察者注册监听后再来进行响应,比KVO多了发送通知的一步,但是其优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用也更灵活。

  • KVO:

    1.KVO,全称为Key-Value Observing,是iOS中的一种设计模式。用于检测对象的某些属性的实时变化情况并作出响应,即当指定的对象的属性被修改后,则对象就会接受到通知,简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。与NSNotification相比之下KVO更加简洁而直接。

    2.KVO只能检测类中的属性,并且属性名都是通过NSString来查找,编译器不会帮你检错和补全,所以比较容易出错。delegate方法最典型的特征是往往需要关注返回值.

    3.一对多

    4.其实KVO做的用NSNotification和delegate都能做到,但KVO有非常便利的地方。

    5.当Model层的某个属性发生改变时我们不需手动post消息就能触发Observer的方法,这个是NSNotification和delegate都做不到的,因为KVO 是 NSObject 内建支持的,使用上非常便利。

  • 总结:

    效率肯定是Delegate比NSNotification高。

你可能感兴趣的:(Delegate、NSNotification、KVO该如何选择?)