多代理的实现方式有很多,如:
- 使用 NSPointerArray 存储 weak delegate;
- 使用 NSHashTable 存储 weak delegate;
- 使用 NSProxy 进行转发;
- 使用 NSObject 封装 target 和 selector,进行遍历调用。
本文讨论的是最后一种,但可以结合 NSProxy 进行高效的转发。
实现原理
对象封装 weak target,和 selector,使用数组存储这个封装对象,在回调的地方,遍历数组调用各个代理方法。
封装对象命名
- Delegator
结合 NSProxy 便捷消息转发
NSProxy 可以实现消息的转发,具体可见 YYWeakProxy 的实现,其可以实现消息转发以达到,调用 proxy 的方法,直接就是调用 target 的方法。
如果结合了 NSProxy,则可以少一层存储和调用 selector 的逻辑。
QMUI 的多代理
QMUI 的多代理实现有点巧妙,其使用方法注入,对 delegate 的 setter 和 getter 属性进行修改,变成调用其容器中的多代理方法。
而其容器也进行了封装,具体看 QMUIMultipleDelegates 的实现。