Notification,Delegate,KVO,Block的浅易理解

来源:互联网 发布:单位网络改造报价单 编辑:程序博客网 时间:2024/04/29 06:47

Notification:
一般是进行全局通知,比如键盘的出现和隐藏,切换控制器或者界面,登录界面,更明显点,可以举个例子,当股票有变动的时候,我们可以通过Notification告诉所有有关的股票持有者。
一对多的使用场景,在某些情况下,KVO和Notification是一样的,都是状态变化之后,告知对方。
需要被观察者主动发出通知,然后观察者注册监听后,再来进行响应,比KVO对了发送通知的一步,
优点:
是监听不局限于属性的变化,还可以对状态变化进行监听,监听范围比较广。
Delegate :
强关联,就是委托和代理双方互相知道,是一对一的关系,是自己不想做或者自己做不了的事,交给代理方去做。一般的使用场景是行为。Delegate只是保存了一个对象指针,直接回调,没有额外的消耗,相对于C的函数指针,只是多做了一个查表动作。Delegate一个很好地优点,就是被weak引用,不会出现内存类型。可以将一组相关的方法集合在一起

实现的原理:
消息的发送者告知接受者,某个事件将要发生,Delegate同意后,发送响应者事件,Delegate机制,使得接收者可以改变发送者的行为
又称委托,是一种设计模式,解除了对象之间的耦合性。改变或传递控制链,允许一个类在某些特定时刻通知到其他类,而不需要获取其指针,减少框架复杂度。

Block:
block是Delegate的另一种形式,不过是一种函数式编程,使用场景和Delegate一样,相比而言,比Delegate更灵活,不过Delegate的实现更加直观。Block出栈需要将使用的数据从栈内存拷贝到堆内存,当然,是OC对象的话,其引用计数是需要+1,使用完成后,Block置nil后,才被消除。对于异步和简单的回调,例如网络请求的回执,用Block更好,同时要注意防止Block的循环引用。
优点:
Block优点很显著,基本通过 inlineBlock快捷输入的方式,就可以完成对一个Block的代码编码和设计,进行功能的逻辑实现书写。
另外,Block可以访问上下文,使代码更加紧凑,同时可以将Block作为一个参数传递,这个貌似是不可替代的优势。
Block的编码更加清晰,当一个ViewController中有多个弹窗事件时,Delegate则需要对每个事件进行判断识别来源。而Block可以直接在创建事件的时候就区分开。对于网络请求,我们只需要请求成功和失败,那么你应该优先使用Block。

延申:
Block的三种形式:
*对于临时性的,只在栈中使用的Block,没有循环问题,Block会自动释放(例如Block遍历数组)
*对于只调用一次的Blcok,需要看内部的实现,正确的实现应该是Block被调用之后,马上赋值为nil,这样Block也会被释放,同样不会循环引用,例如UIView的动画中的Block,一旦调用之后,即可释放。
*多次调用时,Block需要长期存储,就容易出现循环引用
比较:
Delegate的运行成本低,Block成本很高,Delegate需要实现接口,它的声明和方法的实现是分离开来的。
Block和Delegate都是描述两个对象之间的1对1关系,都是用来解决对象间的交互情况,当两个对象之间,通信内容很多时,可优先使用Delegate。苹果在设计Cocoa框架的时候,更多的使用了Delegate。
Delegate的使用场景,更多的适用于重复调用的情景。例如DataSource,这个情况下,对象想通过委托来获取某些数据,可以理解为一种不易改变的属性。
假如我们需要对状态做出比较精细的处理,比如:UIScrollVeiw的不同状态,涉及到多个方法,则需要代理。例如willScrolling&DidStartScroll&EndDecreling

如果一个回调是一个不定期触发或者会多次触发,那么应该选择Delegate;
如果回调是广播性质的,需要很多个不同的类接收,那么用Notification比较合适。
Block主要缺陷就在于使用ARC下的循环引用,Block的回调方式,解决了Delegate在确认声明上的问题。由于Block回调方式,一般都跟在声明之后,可以很快确认回调来源,如网络数据的相应【if(response == nil)】

KVC的实例: 字典转模型,给只读属性赋值(例如tabbar)
KVO的实例:监测进度条,上拉加载,下拉刷新
Notification的实例:监测键盘,切换控制器

0 0
原创粉丝点击