美文网首页
Multicast Delegate

Multicast Delegate

作者: skogt | 来源:发表于2019-07-18 16:23 被阅读0次

讲这个话题之前,我们先回答一个问题,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/

相关文章

网友评论

      本文标题:Multicast Delegate

      本文链接:https://www.haomeiwen.com/subject/kvullctx.html