iOS 对象之间的通信方式(delegate、block、NSNotification、kvc、kvo)总结

来源:互联网 发布:手机离线地图软件 编辑:程序博客网 时间:2024/05/17 05:14

有五种方式:delegate(代理)、block(代码块)、NSNotification(通知)、kvc(键-值编码)、kvo(​键值观察模式)

1. delegate:代理是一种设计模式,它是通过被代理者定义代理协议委托代理者实现协议,用于两个对象间的通信交互。在 IOS 中 delegate 主要用于视图与使用对象之间的通信交互,delegate 的效率是最高的,典型的特就是它有返回值。

用途:常用于传\赋值(如tableView中的委托(dateSource)中常见)或者传递事件(例如在异步请求中,界面事件触发数据层改变等等)。

注意:delegate和通知有的用法相似,区别在于前者是1对1,后者是1对多。在dealloc将delegate置为nil,以及delegate设置属性时用assign,不用retain,避免循环引用


2. Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,block:block 类似与函数,可作为参数进行传递用于回调,block 可以定义在方法里,函数不能。block 语法简单,写在方法里可以访问局部变量可以使代码更加的紧凑,结构化。相对于 delegate,block 不用建立代理协议,它的实现具有封闭性(closure),而又能够很容易获取上下文的相关状态信息,使用简单。

用途:常用于逆向传值、作为方法参数、作为类的属性、作为全局变量

注意:

1)在使用block前需要对block指针做判空处理。不判空直接使用,一旦指针为空直接产生崩溃。

2)在block使用之后要对,block指针做赋空值处理,如果是MRC的编译环境下,要先release掉block对象。block作为类对象的成员变量,使用block的人有可能用类对象参与block中的运算而产生循环引用。将block赋值为空,是解掉循环引用的重要方法。(不能只在dealloc里面做赋空值操作,这样已经产生的循环引用不会被破坏掉)

3)使用方将self或成员变量加入block之前要先将self变为__weak

4)在多线程环境下(block中的weakSelf有可能被析构的情况下),需要先将self转为strong指针,避免在运行到某个关键步骤时self对象被析构。

5)在MRC的编译环境下,block如果作为成员参数要copy一下将栈上的block拷贝到堆上 

意义:Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C语言的扩展,用来实现匿名函数的特性。它允许开发者在两个对象之间将任意的语句当做数据进行传递,往往这要比引用定义在别处的函数直观;

3. 通知:NSnotification 一个中心对象注册和发送通知,所用的其他的对象都可以收到通知。

用途:常常用于在向服务器端请求数据或者提交数据的场景,在和服务器端成功交互后,需要处理服务器端返回的数据,或发送响应消息等
注意:它是同步的消息通知机制,只有Observer将消息处理完毕后,消息发送者才会继续执行,因此在通知处理的地方做大量耗时操作的话,就会带来卡顿的问题啦。

在多线程的应用中,Notification在哪个线程中Post, 就是在那个线程分发,也就在同一个线程中被observer处理。而通常呢,我们会在Observer对象的dealloc方法中去removeObserver,理论上,如果observer的dealloc和消息发送者的postNotification的方法在不同的线程中调用的话,是有可能会导致Crash的。

意义:广播数据,一对多

4.KVC:键-值编码是用于间接访问对象属性的机制,并不需要调用 set 或者 get 方法访问变量,是通过 set value for key 进行间接访问实例变量。


0 0