iOS 常用的几种通信机制

前言

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)可以很容易的获取上下文的状态。

拓展:block为什么要用copy修饰? block:大家称代码块,他类似一个方法。而每一个方法都是在被调用的时候从硬盘到内存,然后去实行,实行完就消失,所以,方法的内存不需要大家管理,也就是说,方法是在内存的栈区。所以,block不像OC中的类对象(在堆区),他也是在栈区的。如果大家使用block作为一个对象的属性,大家会使用关键字copy修饰他,因为他在栈区,大家没办法控制他的消亡,当大家用copy修饰的时候,系统会把该 block的实现拷贝一份到堆区,这样大家对应的属性,就拥有的该block的所有权。就可以保证block代码块不会提前消亡。

注意:

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没有添加过的监听。

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

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

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 16,437评论 8赞 193
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 6,185评论 1赞 20
  • OC语言基础 1.类与对象 类方法 OC的类方法只有2种:静态方法和实例方法两种 在OC中,只要方法声明在@int...
    奇异果好补阅读 3,305评论 0赞 11
  • 在我源说西游前面的文章中,已梳理出第一个准备吃唐僧要长生的妖物是白骨精,第二个是金角大王,第三个是红孩儿。 那么,...
    李玉广阅读 27评论 0赞 0
  • 或许她没这么想 但是给人的感觉很自私 一家人的日程跟着她转 她只有5号有空 于是5号大扫除 而这一天她9点还没起 呵呵
    角落蜷缩阅读 25评论 0赞 0