面试题答案
一键面试1. KVO、观察者模式、代理模式对比
- 使用场景
- KVO(Key - Value Observing):主要用于监听对象属性值的变化,在iOS开发中,适用于数据模型变化时,相关视图需要更新的场景,比如一个用户信息模型的某个属性改变,对应的用户信息展示视图需要更新。
- 观察者模式(Observer Pattern):更通用,用于当一个对象状态发生变化时,需要通知多个依赖它的对象。在iOS开发中,例如游戏场景中,角色状态变化时,通知所有相关的场景元素进行更新。
- 代理模式(Proxy Pattern):通常用于对象间一对一的交互,一个对象(代理)代表另一个对象(委托者)处理某些任务。比如在UITableView的代理方法中,代理对象负责处理表格的各种交互行为。
- 优点
- KVO:实现简单,只需要注册观察者,当被观察属性变化时会自动触发回调。代码耦合度相对较低,被观察对象不需要知道谁在观察它。
- 观察者模式:可扩展性强,能方便地添加或移除观察者。支持广播机制,一个主题对象状态改变可通知多个观察者。
- 代理模式:职责明确,代理对象专注处理特定任务,使委托者对象更简洁。提高了代码的可维护性和可测试性。
- 缺点
- KVO:只能监听属性变化,且依赖于运行时机制,可能带来一定性能开销。被观察对象的属性必须是
@dynamic
或者符合KVO编码规范,限制较多。 - 观察者模式:如果观察者过多,可能导致通知性能问题。主题对象和观察者之间可能存在循环引用问题。
- 代理模式:由于代理对象和委托者对象是一对一关系,当需要多个对象处理同一任务时,需要创建多个代理对象,代码量可能较大。
- KVO:只能监听属性变化,且依赖于运行时机制,可能带来一定性能开销。被观察对象的属性必须是
2. KVO性能问题优化
- 减少不必要的观察:仔细分析项目中哪些属性变化真正需要触发相关操作,取消对不必要属性的KVO监听。
- 合并观察:如果多个属性变化触发的操作类似,可以考虑合并对这些属性的观察,在回调中统一处理,减少回调次数。
- 使用弱引用:避免观察者和被观察对象之间的循环引用,防止内存泄漏,使用
NSKeyValueObservingOptions
中的NSKeyValueObservingOptionInitial
选项,在注册观察时就获取初始值,避免不必要的重复处理。 - 优化回调处理逻辑:在KVO回调方法中,尽量减少复杂的计算和耗时操作,将耗时操作放到后台线程处理,或者优化算法,提高处理效率。