美文网首页iOS技术知识点
iOS开发中的多代理模式(弱引用数组)

iOS开发中的多代理模式(弱引用数组)

作者: 梁森的简书 | 来源:发表于2020-03-30 10:24 被阅读0次

代理:一对一
通知:一对多
多代理模式:一对多

核心思想

消息转发,把未实现的代理方法转发给多个代理去执行。

注意点

使用NSPointArray持有多个代理对象(弱引用,代理对象的引用计数不会增加)。

1.创建一个多代理管理类的单例MultiDelegatesManager。
2.将代理对象添加到MultiDelegatesManager单例中。
3.当需要被添加到MultiDelegatesManager单例中的代理对象执行代理方法的时候,在MultiDelegatesManager单例中进行消息转发。

主要代码:

  // 测试多代理
- (void)testMultiDelegates{
[[MultiDelegatesManager shareHelper] addDelegate:self];
[[MultiDelegatesManager shareHelper] sendMessage];
}
// 代理方法
- (void)doSomethings{
NSLog(@"多代理模式下通过消息转发实现代理方法。。。");
}  

  - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector{
NSMethodSignature *signature = [super methodSignatureForSelector:aSelector];
if (signature) {
    return signature;
}
[_delegates compact]; // 遍历之前记得清除野指针
for (id delegate in _delegates) {
    if (!delegate) {
        continue;
    }
    
    signature = [delegate methodSignatureForSelector:aSelector];
    if (signature) {
        break;
    }
}
return signature;
}
- (void)forwardInvocation:(NSInvocation *)anInvocation{
SEL sel = [anInvocation selector];
BOOL isRespond = NO;
[_delegates compact];
//遍历存储给个对象的代理,发送给每个要实现代理方法的对象
for (id delegate in _delegates) {
    if (delegate && [delegate respondsToSelector:sel]) {
        [anInvocation invokeWithTarget:delegate]; // 发送方法
        isRespond = YES;
    }else{
        NSLog(@"%@没有响应代理方法...", delegate);
    }
}
if (!isRespond) {
    [self doesNotRecognizeSelector:sel]; // 未识别的方法抛异常,避免闪退
}
}

--

@property (nonatomic, readonly, strong) NSPointerArray *delegates;

delegates是NSPointerArray类型的,对添加到其中的对象是弱引用。
添加代理对象的方法:

  - (void)addDelegate:(id<mutilDelegatesDelegate>)delegate{
if (delegate && ![_delegates.allObjects containsObject:delegate]) {
    [_delegates addPointer:(__bridge void*)delegate];
}

}

demo地址:https://github.com/yangguanghei/---

疑问:用__weak修饰对象之后不就是弱引用了吗?

强引用一个弱引用的对象 依旧是强引用(block内部对弱引用对象再次强引用怎么解释?iOS开发中在block中为什么要__weak和__strong配合使用
数组内部对用weak修饰的变量(weak变量存储在弱引用表中)又进行了一次strong强引用。
block内部有时也会再次使用strong,当block结束后strong修饰的对象也会被释放。

为什么要使用NSPointerArray?

我们使用代理的时候,都会将delegate设置成weak属性,防止循环引用,这里使用NSPointerArray也是为了防止循环引用。
关于多代理,大家也可以看看QMUI中的QMUIMultipleDelegates,代码写的是高端大气,神秘莫测😄。

OC中的弱引用容器都有哪些?

除了NSPointerArray还有NSMapTable和NSHashTable

相关文章

  • 设计模式之注册模式实现多代理

    设计模式之代理模式,在iOS开发中多指单代理。以下有个场景,类A,B,C,若指定b为a的代理对象,若触发协议方法,...

  • NSTimer的循环引用问题解决方案

    iOS开发中,针对循环引用的问题,会有很多方面,block,代理,自循环,多循环,还有一个就是Timer的循环引用...

  • iOS开发---图解代理

    什么是代理? 代理(Delegate)是iOS开发中的一种重要的消息传递方式,是iOS开发中普遍使用的通用设计模式...

  • iOS 开发模式

    - ios开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~ - (一)代理模式 应用场...

  • 常见的几种设计模式

    iOS开发学习中,经常弄不清楚iOS的开发模式,今天我们就来进行简单的总结和探讨~ 一 、代理模式 应用场景:当一...

  • iOS开发中的几种设计模式介绍

    iOS开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~ (一)代理模式 应用场景:当一...

  • iOS代理模式的使用,委托(delegate)

    在iOS开发中代理是非常常见和普遍的,代理是一种通用的设计模式,iOS中对代理支持的很好,由代理对象、委托者、协议...

  • iOS中代理属性为什么要用Weak修饰?

    iOS中代理属性为什么要用Weak修饰? 一.写在前面 代理设计模式,在iOS开发过程中,是一个非常常见的设计模式...

  • iOS设计模式

    ios开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~(一)代理模式应用场景:当一个类...

  • [学习笔记]_iOS代理基本使用,界面间传值

    参考链接: 你真的了解iOS代理设计模式吗? iOS开发-Protocol协议及委托代理(Delegate)传值 ...

网友评论

    本文标题:iOS开发中的多代理模式(弱引用数组)

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