Multicast Delegate

讲这个话题之前,我们先回答一个问题,delegatenotification有什么区别?
可能绝大多数拿到这个话题,脱口而出且自信满满的回答:一个是一对一,一个是一对多。
这个答案其实并不完全正确,其实本质区别应该是命令式和响应式的区别

delegate模式其实也是能够实现出一对多的功能的,delegate模式的一对一只是常规来讲,但并不是绝对的。
正如xmpp的GCDMulticastDelegate就给我们上演了一出multi delegate。

GCDMulticastDelegate

multi delegate与常规的delegate不同,multi delegate并没有实现协议中的方法,而是将协议中的方法转发到自己delegate链中的对象。对multi delegate对象调用协议方法时,由于GCDMulticastDelegate没有实现协议方法,因此会触发消息转发。GCDMulticastDelegate重写了methodSignatureForSelector:forwardInvocation:,该类的forwardInvocation函数触发时,在该函数中会遍历delegate链,对每一个delegate对象(在源码中每一个delegate是一个node)调用协议方法,从而实现了一对多的数据交互。同时,在对multi delegate调用协议方法时,采用的是异步的方式,协议方法会立刻返回,不会阻碍当前函数。(All delegates MUST be invoked ASYNCHRONOUSLY.)
其中有一点也是值得关注的,弱引用的delegate消亡处理。

NSPointerArray

A collection similar to an array, but with a broader range of available memory semantics.
此处引出NSPointerArray的原因是上面提到了GCDMulticastDelegate对于弱引用delegate消亡时候的处理,有种更简单方便的处理就是用NSPointerArray。NSPointerArray类似于array,但是又可以管理其内存。不负责任讲NSPointerArray是一个可以管理对象内存的数组(可以储存对象,但是又不增加对象的引用计数)。所以就算NSPointerArray中某一个弱引用对象销毁了,NSPointerArray也不会出现任何问题,它可以hold nil values

The pointer array class is modeled after NSArray, but can also hold nil values. You can insert or remove nil values which contribute to the array's count.

NSPointerArray虽然可以跟踪内存,但是性能是它的瓶颈,所以它的使用场景一般是小的数据集合,如果是大的数据集合,那么它就不太合适了.

引用

https://objccn.io/issue-7-1/
https://github.com/robbiehanson/XMPPFramework/

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容