iOS------五大传值的比较

本文对比了iOS开发中四种常见的传值方式:属性传值用于关联对象,block和代理作为回调机制,block更灵活但可能引发循环引用;通知支持一对多,KVO用于对象间同步,但不监听方法。还分析了block和代理的效率及关系区别。
摘要由CSDN通过智能技术生成

1.属性传值:通常用于正向传值,适用于A和B相互具有一定关联性。不能用于隔页面传值。而且,需要传值的属性不能是私有属性,也就是在.h中声明出来的属性才可以传值。

2.block传值:常用于回调,同属性传值一样,需要两个控制器具有一定的关联性。不能夸页面传值,如果要夸页面传值,也是A到B,B到C。

3.代理传值:代理传值和Block传值相识,都是将事件分发出来。但与block的不同于,代理具有松耦合性,谁想处理,就把谁设置为代理。

4.通知传值:可以轻松一对多的传值,常用语更换主题的操作。在某个控制器发生事件,其他已存在的控制器做出响应。

5.KVO传值:KVO更适合任何类型的对象监听另一对象的改变(这里也可以是controller,但一般不是controller)。这是一个对象与另一个对象保持同步的一种方法,当另一种对象的状态发生改变时,观察对象马上做出反应。但他只能用来对属性做出反应,而不会用来对方法或者动作做出反应。

比较
1.block和代理传值的区别

相同:
block和代理都是回调的方式

不同:
block是一种轻量级的回调,可以直接访问上下文,由于block的代码是内联的,运行效率更高。block就是一个对象,实现了匿名函数的功能,所以可以把block当作一个成员变量,属性,参数使用,使用起来更加灵活。而block的运行成本更高,block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是引用计数加一,使用完或者block只为nil才销毁。
delegate只是保存了一个对象指针(一定要用weak修饰,不然回循环引用),直接回调,没有额外的消耗。block容易造成循环引用,且不易察觉。为了block不被回收,要用copy关键字修饰。

2.KVO和通知的区别

相同:
都可以进行一对多的关系

不同:
通知需要被观察者先主动发出通知,然后观察者注册监听后,在进行响应,比KVO多了发送通知的一步,但是其优点是监听不局限于属性的变化,可以进行多种多样的状态变化进行监听,监听范围广,使用灵活。

3.代理和通知的区别

不同:代理比通知的效率高。delegate是强关联,委托和代理双方互相知道。通知是弱相连,不需要知道谁发,也不需要知道是谁接受。代理是一对一的关系,通知是一对多的关系。delegate一般是行为需要别人来完成,通知是全局通知。代理要实现对多个类发送消息可以通过将代理者加入集合类后遍历,或者通过消息转发来实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值