iOS 成长之路

iOS 常用的几种通信机制

2018-08-16  本文已影响5人  奋拓达

前言

iOS开发通信的方式一共有五种

1. Delegate-代理模式
2. Block-块
3. Notification-通知中心
4. KVC-键值编码
5. KVO-键值观察者

那么在实际的开发中该如何选择呢?我们来深入理解一下他们之间存在的不同和相似的地方

1. delegate

概念:代理是开发中最普遍的一种设计模式,是通过被代理者定义代理协议,然后委托代理者实现协议,主要用于两个对象之间的传值交互。实际开发中的使用场景用于视图,与使用对象之间的交互,其最显著的特点就是它用返回值

注意:常用于传值操作,delegate和通知有的用法是相同的,区别在于前者是一对一,后者是一对多。在dealloc将带来置为nil,而且在delegate设置属性的时候要用assign关键字修饰,以免造成循环引用

意义:delegate的效率最高

2. block

概念:iOS4.0之后提供的语法,block的使用可以理解为C语言的函数,而且具有运行时的特性,和标准C的函数,但是其运行需要编译器和运行时支持,可作为参数进行值得传递用于回调,block可以定义在方法内,但是函数不能,block语法简洁但是不容易理解,block方法内部可以访问局部变量使代理更加紧凑,结构化。相当于delegate,block不用建立代理协议,使用简单,它的实现具有封闭性(closure)可以很容易的获取上下文的状态。

注意:

1.在使用block前,需要对block做空值判断,如果不做判断一旦出现空值就会产生崩溃。

2.在使用block之前,block先做空值处理,如果是在MRC的环境下,要先release其block对象,block作为类对象的成员变量,使用block极有可能产生循环引用,将block赋空值,是循环引用的重要方法

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

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

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

意义:广播数据,一对多

4. KVC

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

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

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

5. KVO

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

注意:

1.addObserver之后,在不需要监听时,及时remove,否则被监听对象释放后,再触发监听器会引起crash

2.addObserver方法与removeObserver方法要一一对应。不要重复添加监听,也不要remove没有添加过的监听。

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

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

上一篇下一篇

猜你喜欢

热点阅读