面试题答案
一键面试1. 使用代理(Delegate)
- 实现方式:
- 在视图B中定义一个代理协议,协议中声明视图B修改数据后需要通知视图A更新的方法。
- 视图A遵守该协议,并实现协议中的方法。
- 在视图B中设置代理为视图A,当视图B数据修改完成,调用代理方法通知视图A更新。
- 优点:
- 代码结构清晰,视图B与视图A之间的依赖关系明确,低耦合。
- 代理协议可定制性强,能根据具体需求定义不同的方法。
- 缺点:
- 当视图B需要与多个视图进行数据传递时,会需要管理多个代理,代码量增加且维护成本上升。
- 只能一对一传递数据,不适用于一对多的数据传递场景。
2. 使用通知(NSNotification)
- 实现方式:
- 视图B在数据修改完成后,发送一个通知,携带修改后的数据。
- 视图A在合适的地方(如
viewDidLoad
)注册接收该通知,并实现对应的通知处理方法,在方法中更新显示。
- 优点:
- 可以实现一对多的数据传递,一个视图发送通知,多个视图都可以接收并处理。
- 视图之间耦合度低,不需要提前知道对方的存在。
- 缺点:
- 代码调试相对困难,因为通知是全局广播的,可能会被不相关的视图接收到并处理,引发潜在问题。
- 通知的发送和接收之间的关系不够明确,不利于代码的维护和理解。
3. 使用单例(Singleton)
- 实现方式:
- 创建一个单例类,用于存储共享数据。
- 视图B修改数据时,更新单例中的数据。
- 视图A在合适时机(如
viewWillAppear
)从单例中获取最新数据并更新显示。
- 优点:
- 数据共享方便,所有视图都可以直接访问单例中的数据,易于实现数据同步。
- 适用于多个视图之间频繁共享数据的场景。
- 缺点:
- 单例类生命周期较长,可能会导致内存占用问题。
- 多个视图同时访问和修改单例数据可能引发线程安全问题,需要额外处理。