【iOS】——多界面传值方式的比较


前言

在iOS中有五大多界面传值方式,分别为属性传值、协议传值、通知传值、KVO传值和Block传值。下面就简单介绍并比较一下这几种传值方式。


一、属性传值

在Objective-C中,可以使用@property关键字来定义属性,并通过生成setter和getter方法来传递值。
一般多用于前一个界面向后一个界面传值。

二、协议传值

在iOS中,可以使用协议(Protocol)来进行值的传递。协议定义了一组方法和属性的集合,用于描述某个特定的功能或行为。通过遵循协议,一个类或结构体可以实现协议中定义的方法和属性,并将其作为值的传递方式。
一般多用于后一个界面向前一个界面传值。

其基本步骤如下:
1.在发送者的接口部分中定义协议和代理方法
2.在发送者的接口部分中声明一个代理对象
3.在发送者的实现部分中通过通过代理对象实现代理方法并赋值
4.接收者的接口部分遵循协议并声明代理方法
5.在接收者的实现部分将发送者的代理对象设置为自身
6.在接收者的实现部分实现代理方法并接收值

优点

  • 协议传值允许不同的对象实现相同的协议并交互。这使得代码更具灵活性,易于扩展和修改。
  • 通过定义协议,可以将值传递的逻辑和功能分离出来,使其可复用于不同的对象之间。这样可以提高代码的复用性和可维护性。

缺点

  • 只能用于相邻界面的传值,不能跨越多个界面传值
  • 使用协议进行值传递可能需要定义和实现额外的协议和方法,增加了一定的代码量和复杂性

通知传值

在iOS开发中,可以使用通知(Notification)进行值的传递和对象之间的通信。通知是一种广播机制,允许多个对象在不直接知道彼此的情况下进行通信。
通知传值可以跨越多个界面进行传值,一般用于后一个界面向前一个界面传值。
其基本步骤如下:

1.在发送者中创建并发送通知
2.在接收者中注册观察者
3.在接收者中接受通知
4.在使用完或不使用时销毁通知

优点

  • 通知机制支持多个接收者,多个对象可以同时接收同一个通知并进行处理。这样可以实现一对多的通信,方便跨多个对象进行值传递。
  • 通知机制可以在任何地方发送和接收通知,不限于特定的对象关系或层级结构。这使得代码更加灵活,可以适应各种场景和需求。

缺点

  • 通知是一种广播机制,所有注册了相应通知的对象都会接收到通知,无法精确地控制接收者
  • 使用通知机制时,需要注意正确地添加和移除通知的观察者,以避免引发内存管理问题,如循环引用。

KVO传值

KVO(Key-Value Observing)是一种iOS开发中的观察者模式,用于观察对象属性值的变化并进行相应的处理。通过KVO,可以实现对象之间的值传递和通知。
其基本步骤如下:

1.注册观察者:在观察者对象中,通过addObserver:forKeyPath:options:context:方法来注册对某个属性的观察。
2.实现监听方法:在观察者对象中,实现一个监听方法- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context,监听方法会在被观察的属性发生变化时被调用。
3.移除观察者:在观察者对象不再需要监听属性变化时,记得调用 removeObserver:forKeyPath: 方法来移除观察者,避免潜在的内存泄漏。

KVO可以监听单个属性的变化,也可以监听集合对象的变化。当监听单个属性的变化时会自动触发,当监听集合对象的变化时需要手动触发,这是因为KVO只是监听setter方法,例如像可变数组添加元素的方法它不属于setter方法,所以向可变数组中添加元素时不会有监听反应。

优点

  • KVO机制可以实现对属性值的实时观察和响应。当被观察的属性值发生变化时,观察者会立即收到通知并进行处理,可以及时获取最新的值。
  • KVO支持多个观察者对同一个属性进行观察。这样可以实现一对多的通信,多个观察者可以同时接收到属性值的变化通知。

缺点

  • KVO机制只能对继承自NSObject的类的属性进行观察,无法对结构体(struct)等非NSObject子类的属性进行观察。
  • 在使用KVO时,需要注意正确地添加和移除观察者,以避免引发内存管理问题,如循环引用。

Block传值

在iOS开发中,可以使用Block(闭包)进行值的传递和回调操作。Block是一种封装了一段代码的对象,可以在需要的时候执行该代码块。
其基本步骤如下:

1.定义Block类型:在合适的地方定义一个Block类型,用于声明需要传递的代码块。
2. 传递Block:在需要传递值的地方,将一个Block作为参数传递给其他对象或函数。
3.回调执行:在接收方的对象中,执行传递进来的Block,并获取传递的值。

优点

  • Block提供了一种灵活的方式,可以封装一段代码并在需要的时候执行。这使得值传递的逻辑可以根据具体需求进行定制和扩展。
  • Block可以用于异步操作,例如在网络请求完成后执行回调操作。这样可以实现非阻塞的异步编程模式,提高代码的响应性和用户体验。

缺点

  • 使用Block时,需要注意对循环引用和内存泄漏的处理。Block可能会持有其所捕获的变量和对象,如果不正确地处理循环引用,可能会导致内存泄漏。
  • 较复杂的Block可能会导致代码变得难以理解和维护。由于Block可以封装任意代码逻辑,过度复杂或嵌套的Block可能会降低代码的可读性和可维护性。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值