代理、nsnotification和kvo的区别和用法
2016-01-07 15:35
323 查看
个人在网上浏览一些文档发现蛮有意思的,现转载下来供大家学习查看。
1.效率肯定是
2.
最典型的特征是,
相反的,
简明概要的说明了
和
1)这两个都是负责发出通知,剩下的事情就不管了,所以没有返回值;
2)
1)KVO的使用:
被观察者发出
然后只要被观察者的
因此观察者需要实现方法
这 些代码都只需在观察者里进行实现,被观察者不用添加任何代码,所以谁要监听谁注册,然后对响应进行处理即可,使得观察者与被观察者完全解耦,运用很灵活很 简便;但是
2)NSNotification的使用
这里的通知不是由被观察者发出,而是由
首先被观察者自己在必要的方法
然后谁要监听
原文地址:http://www.zybang.com/question/7de351204a7e746dfafe75ec083b4b78.html
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多了发送通知的一步,但是其优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用也更灵活。
原文地址:http://www.zybang.com/question/7de351204a7e746dfafe75ec083b4b78.html
相关文章推荐
- C#使用委托(delegate)实现在两个form之间传递数据的方法
- Query中click(),bind(),live(),delegate()的区别
- jQuery中 delegate使用的问题
- 浅谈jquery中delegate()与live()
- 由点击页面其它地方隐藏div所想到的jQuery的delegate
- jQuery中delegate与on的用法与区别示例介绍
- JS delegate与live浅析
- jQuery事件 delegate()使用方法介绍
- .NET笔记之:Delegate内部原理的分析
- C#匿名方法与Delegate类型转换错误分析
- jQuery中delegate和on的用法与区别详细解析
- iOS中jQuery 的delegate 事件监听无效解决办法
- iOS页面传值总结
- UITextField常用delegate
- 试说明在C#中Delegate类的使用
- delegate 委托的使用
- C#的Delegate的小心得
- iOS 如何选择delegate、notification、KVO?
- OC学习之--类的扩展
- 马上着手开发 iOS 应用程序 至 读后笔记