iOS开发常用传值方式的比较
Posted Billy Miracle
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS开发常用传值方式的比较相关的知识,希望对你有一定的参考价值。
有关几种传值的方法可以查看以下几篇博客:
[iOS开发]多界面传值之代理传值
[iOS开发]KVO传值
[iOS开发]block传值
[iOS开发]通知传值
简介:
- 属性传值:通常用于正向传值,适用于A和B相互具有一定关联性。不能用于隔页面传值。而且,需要传值的属性不能是私有属性,也就是说在.h中声明出来的属性才可以传值。
- block传值:常用于回调,同属性传值一样,需要两个控制器间具有一定关联性。不能跨页面传值。
如果一定要跨,就要像接力赛一样,A传给B,B传给C。 - 代理传值:代理传值和block传值相似,都是将事件分发出去。但是与block的不同在于,代理具有松耦合性,谁想处理,把它设置成为代理即可。
- 通知传值:可以轻松一对多的传值方式,常见于更换主题的操作。在某个控制器发生事件,其他已存在的控制器作出响应。这里注意一点,是已存在。
- KVO传值:KVO更加适合任何类型的对象侦听另外一个任意对象的改变(这里也可以是controller,但一般不是controller)。这是一个对象与另外一个对象保持同步的一种方法,即当另外一种对象的状态发生改变时,观察对象马上作出反应。它只能用来对属性作出反应,而不会用来对方法或者动作作出反应。
比较:
- block和代理传值的区别:block是一种轻量级的回调,可以直接访问上下文,由于block的代码是内联的,运行效率更高。block就是一个对象,实现了匿名函数的功能。所以我们可以把block当做一个成员变量、属性、参数使用,使用起来非常灵活。blcok的运行成本高。block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是引用计数加1,使用完或者block置nil后才销毁。delegate只是保存了一个对象指针(一定要用week修饰delegate,不然也会循环引用),直接回调,没有额外消耗。block容易造成循环引用,而且不易察觉。为了blcok不被回收,要用copy关键字修饰。
- KVO和通知的区别:NSNotification的特点,就是需要被观察者先主动发出通知,然后观察者注册监听后,再来进行响应,比KVO多了发送通知的一步,但是其优点是监听不局限属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用灵活。
- 代理和通知的区别:效率:代理比通知高;关联:delegate是强关联,委托和代理双方互相知道。通知是弱关联,不需要知道是谁发,也不需要知道是谁接收。代理是一对一的关系,通知是一对多的关系。delegate一般是行为需要别人来完成。通知是全局通知。代理要实现对多个类发出消息可以通过将代理者添加入集合类后遍历,或通过消息转发来实现。
以上内容学习参考于
iOS面试题:通知,代理,KVO的区别,以及通知的多线程问题
[iOS开发]常用传值方法的实现与比较
以上是关于iOS开发常用传值方式的比较的主要内容,如果未能解决你的问题,请参考以下文章