前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS踩坑之多代理模式使用注意

iOS踩坑之多代理模式使用注意

作者头像
woopDast1
发布2020-09-04 10:46:55
8270
发布2020-09-04 10:46:55
举报
文章被收录于专栏:iOSeriOSer

结论

在需要使用多代理效果时,必须卡在把最后一个代理对象加入multiDelegate的delegates数组后,再对delegate赋值。否则,会导致后添加的代理对象特有的代理方法不回调的问题。 多代理库推荐:

https://github.com/JyyJDast1/MultiDelegateOC

原理

打断点得知:在用多代理对象对delegate赋值时,会触发库中AIMultiDelegate.m文件中- (BOOL)respondsToSelector:(SEL)selector方法,如果此时,multiDelegate对象的delegates数组中的所有代理对象还不全(还未包含你想添加的代理对象),那么未被添加的代理对象特有的实现的代理方法会被respondsToSelector方法判定为NO,导致无法被调用。即使后面重新通过addMultiDelegate或对delegate赋值,都不会生效。

因此,必须在你确保没有代理对象需要加入multiDelegate的delegates数组时,才能对delegate进行赋值。

示例

A库有代理方法1,2; B库需要实现A库的代理方法1; C功能需要实现A库的代理方法1和方法2; 为使BC都响应A的代理方法,需要使用多代理。 错误示例,下面方法会导致C类中实现的A的特有代理方法(特有:意指B中未实现)无法回调:

代码语言:javascript
复制
[A对象 addMultiDelegate:B对象];
A对象.delegate = A对象.multiDelegate;
[A对象 addMultiDelegate:C对象];

正确示例:

代码语言:javascript
复制
[A对象 addMultiDelegate:B对象];
...
[A对象 addMultiDelegate:C对象];
A对象.delegate = A对象.multiDelegate;
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-08-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 结论
  • 原理
  • 示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档