讲这个话题之前,我们先回答一个问题,delegate
与notification
有什么区别?
可能绝大多数拿到这个话题,脱口而出且自信满满的回答:一个是一对一,一个是一对多。
这个答案其实并不完全正确,其实本质区别应该是命令式和响应式的区别
。
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 removenil
values which contribute to the array's count.
NSPointerArray虽然可以跟踪内存,但是性能是它的瓶颈,所以它的使用场景一般是小的数据集合,如果是大的数据集合,那么它就不太合适了.
引用
https://objccn.io/issue-7-1/
https://github.com/robbiehanson/XMPPFramework/