NSNotification、delegate和KVO的区别

转载 2015年11月17日 20:53:19

1.效率肯定是delegate比nsnotification高。

2. delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要关注返回值, 也就是delegate方法的结果。比如-windowShouldClose:,需要关心返回的是yes还是no。所以delegate方法往往包含 should这个很传神的词。也就是好比你做我的delegate,我会问你我想关闭窗口你愿意吗?你需要给我一个答案,我根据你的答案来决定如何做下一 步。相反的,notification最大的特色就是不关心接受者的态度, 我只管把通告放出来,你接受不接受就是你的事情,同时我也不关心结果。所以notification往往用did这个词汇,比如 NSWindowDidResizeNotification,那么nswindow对象放出这个notification后就什么都不管了也不会等待接 受者的反应。

简明概要的说明了KVO和NSNotification的区别:

和delegate一样,KVO和NSNotification的作用也是类与类之间的通信,与delegate不同的是1)这两个都是负责发出通知,剩下的事情就不管了,所以没有返回值;2)delegate只是一对一,而这两个可以一对多。这两者也有各自的特点。

1)KVO的使用:

被观察者发出  addObserver:forKeyPath:options:context:  方法来添加观察者。

然后只要被观察者的keyPath值变化(注意:单纯改变其值不会调用此方法,只有通过getters和setters来改变值才会触发KVO),就会在观察者里调用方法observeValueForKeyPath:ofObject:change:context:

因此观察者需要实现方法 observeValueForKeyPath:ofObject:change:context: 来对KVO发出的通知做出响应。

这 些代码都只需在观察者里进行实现,被观察者不用添加任何代码,所以谁要监听谁注册,然后对响应进行处理即可,使得观察者与被观察者完全解耦,运用很灵活很 简便;但是KVO只能检测类中的属性,并且属性名都是通过NSString来查找,编译器不会帮你检错和补全,纯手敲所以比较容易出错。

2)NSNotification的使用
这里的通知不是由被观察者发出,而是由NSNotificationCenter来统一发出,而不同通知通过唯一的通知标识名notificationName来区分,标识名由发送通知的类来起。
首先被观察者自己在必要的方法A里,通过方法postNotificationName:object:来发出通知notificationName这样发送通知者这边的工作就完成了,每次A被调用,就会发送一次通知notificationName。
然后谁要监听A的变化,就通过[NSNotificationCenter defaultCenter]的方法addObserver:selector:name:object:为观察者注册监听name为notificationName的通知然后每次发出name为notificationName的通知时,注册监听后的观察者就会调用其自己定义的方法notificationSelector来进行响应。
NSNotification的特点呢,就是需要被观察者先主动发出通知,然后观察者注册监听后再来进行响应,比KVO多了发送通知的一步,但是其优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用也更灵活。

NSNotification、KVO、Delegate的同步和异步问题

近期探究了NSNotification、KVO、Delegate的同步和异步问题,发现之前项目中很多NSNotification的用法会导致性能的下降。 下面通过代码截图看下具体的情况: 首先在一个...
  • lcl12111211
  • lcl12111211
  • 2017年03月23日 15:23
  • 452

KVO与Notification之间的区别以及详解

如果在一个类中想要执行另一个类中的方法可以使用通知 1.创建一个通知对象:使用notificationWithName:object: 或者 notificationWithName:object:...
  • s0228g0228
  • s0228g0228
  • 2014年07月31日 10:43
  • 1196

NSNotification是同步还是异步?

之前面试被问到NSNotification在发送通知的时候,是同步还是异步,当时自己真不清楚,然后这两天又遇到这个问题,自己写了代码测试一下。代码如下:#import "ViewController....
  • lxubin
  • lxubin
  • 2016年07月30日 17:17
  • 7204

笔记:NSNotification,delegate和KVO的区别(转)

1.效率肯定是delegate比nsnotification高。 2. delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要关注返回值, 也就是...
  • danieljustice
  • danieljustice
  • 2016年06月03日 09:31
  • 130

delegate,notification,KVO三种模式实现通信的优缺点

在开发ios应用的时候,我们会经常遇到一个常见的问题:在不过分耦合的前提下,controllers间怎么进行通信。在IOS应用不断的出现三种模式来实现这种通信: 1.委托delegation; ...
  • qq_33351410
  • qq_33351410
  • 2016年09月16日 10:07
  • 356

KVO与通知的区别

KVO提供一种机制,当指定的被观察的对像的属性被修改后,KVO会自动通知响应的观察者,KVC(键值编码)是KVO的基础 通知:是一种广播机制,在实践发生的时候,通过通知中心对象,一个对象能够为所有关...
  • anywhereIOS
  • anywhereIOS
  • 2016年03月10日 10:56
  • 3466

代理、nsnotification和kvo的区别和用法

个人在网上浏览一些文档发现蛮有意思的,现转载下来供大家学习查看。1.效率肯定是delegate比nsnotification高。 2. delegate方法比notification更加直接。 ...
  • linfengwenyou
  • linfengwenyou
  • 2016年01月07日 15:35
  • 596

代理<delegate>、通知<NSNotification>、KVO三者之间的区别

我们在开发iOS应用时,会经常遇到一些常见的问题:在不过分要求耦合的前提下,各个Controller之间是怎么进行通信的,随着在iOS应用开发的过程中出现了以下三种普通的方法来实现这种通信,从而达到各...
  • zhangzhaoyuan1016
  • zhangzhaoyuan1016
  • 2016年11月08日 11:16
  • 105

iOS通知和KVO的区别和用法

【NSNotification、delegate和KVO的区别】 1.效率肯定是delegate比nsnotification高。 2. delegate方法比notification更加直接,最...
  • mrSunHR
  • mrSunHR
  • 2015年06月26日 17:38
  • 2169

iOS中block和delegate的区别(面试必问)

作为非常常见,且不出不在的block和delegate,理解它们,是我们掌握iOS开发必备知识点。 1.从源头上理解和区别block和delegate delegate运行成本低,block的运行...
  • u010670946
  • u010670946
  • 2017年05月07日 17:37
  • 802
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NSNotification、delegate和KVO的区别
举报原因:
原因补充:

(最多只允许输入30个字)