iOS笔记—iOS对象之间通信方式有哪些?

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



delegate

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

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

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

意义:delegate 的效率最高。


block

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

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

注意:

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语言的扩展,用来实现匿名函数的特性。它允许开发者在两个对象之间将任意的语句当做数据进行传递,往往这要比引用定义在别处的函数直观,


NSnotification

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

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

意义:广播数据,一对多


KVC

概念:Key-value coding,它是一种使用字符串标识符,一个非正式的 Protocol,间接访问对象属性的机制,而不是直接调用getter 和 setter方法是通过 set value for key 进行间接访问实例变量。

用途:动态访问你要存取的类的属性、动态访问和修改私有变量

注意:可以1对1,也可以1对多。
意义:提供一种机制来间接访问对象的属性


KVO

概念:KVO,被观察者添加观察者,被观察者使用KVC键值编码来修饰它的实例变量,当被观察者发生改变时,观察者就能侦听到被观察者改变的事件,从而做出相应。

注意:

1. addObserver之后,在不需要监听时,及时remove,否则被监听对象释放后,再触发监听器会引起crash
2. addObserver方法与removeObserver方法要一一对应。不要重复添加监听,也不要remove没有添加过的监听。

用途:对指定对象的某个属性进行观察,当属性发生变化时,进行通知.

意义:提供了一种当其它对象属性被修改的时候能通知当前对象的机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值