前言
在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可能会降低代码的可读性和可维护性。