iOS 代理和通知
2019-03-09 本文已影响0人
快乐的老船长
代理和通知的区别
- 效率:代理比通知高;
- 关联:delegate是强关联,委托和代理双方互相知道。通知是弱关联,不需要知道是谁发,也不需要知道是谁接收。
- 代理是一对一的关系,通知是一对多的关系。delegate一般是行为需要别人来完成。通知是全局通知。
- 代理要实现对多个类发出消息可以通过将代理者添加入集合类后遍历,或通过消息转发来实现。
KVO和通知的区别
- 相同:都是一对多的关系;
- 不同:通知是需要被观察者先主动发出通知,观察者注册监听再响应,比KVO多了发送通知这一步。
- 监听范围:KVO是监听一个值的变化。通知不局限于监听属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用更灵活。
- 使用场景:KVO的一般使用场景是监听数据变化,通知是全局通知。
block和代理的区别
相同点:block和代理都是回调的方式。使用场景相同。
不同点:
- block集中代码块,而代理分散代码块。所以block更适用于轻便、简单的回调,如网络传输。
代理适用于公共接口较多的情况,这样做也更易于解耦代码架构。 - block运行成本高。block出栈时,需要将使用的数据从栈内存拷贝到堆内存。当然如果是对象就是加计数,使用完或block置为nil后才消除。
代理只是保存了一个对象指针,直接回调,并没有额外消耗。相对C的函数指针,只是多做了一个查表动作。
KVO的使用
- 被观察者发出 addObserver:forKeyPath:options:context: 方法来添加观察者。
- 观察者里实现observeValueForKeyPath:ofObject:change:context:来监听被观察者的keypath值变化
- 特点:观察者和被观察者完全解耦,运用很灵活简便。
KVO的注意事项:
- KVO只能检测类中的属性,并且属性名都是通过NSString来查找,编译器不会帮你检错和补全,纯手敲比较容易出错。
通知的使用
- 通知由通知中心统一发出,根据通知name区分通知。
- 谁要监听某个name事件,就注册名为name的监听[[NSNotificationCenter defaultCenter]addObserver:selector:name:object: ]。收到名为name的通知后,在selector里响应。
- 特点:需要被观察者主动发出通知,观察者注册监听后再进行响应。比KVO多了发通知这一步。
- 优点:不局限于属性的变化,可以对多种多样的状态变化进行监听,监听范围广,使用更灵活。
实现代理需要注意什么?
委托方:
- 委托者代理属性的修饰词要用weak;
- 调用代理方法时,要先检查代理属性是否为空,并且是否实现了代理方法;
代理方:
- 包含委托方的头文件;
- 遵循协议;
- 实现代理方法。
协议和代理的理解
协议
- 协议是一个方法签名的列表,
- 可以定义多个方法。
- 根据配置,遵守该协议的类会去实现这个协议中规定的若干方法。
协议:用来规定代理双方可做什么,必须做什么。
代理:根据指定的协议,完成委托方需要实现的功能。
委托:根据规定协议,指定代理去完成什么功能。