Runtime objc4-779.1 一图看懂iOS Runtime消息转发

消息发送流程图

设定消息接受者为receiver
图是用markdown画的,适配可能有点问题,浏览器页面放大看好一些

Created with Raphaël 2.2.0 开始 objc_msgSend(receiver, SEL) 通过receiver,获取isa指针,并获取其class 在class的cache中查找SEL是否存在? 匹配Method,执行IMP 结束 在class的method_list中查找SEL是否存在? 在去父类中查找SEL是否存在? 当前类为NSObject,SEL是否存在? resolveInstanceMethod or resolveClassMethod forwardingTargetForSelector 返回其他接收者? 重新发送消息给新的接收者 methodSignatureForSelector是否返回方法签名? forwardInvocation unrecognized selector sent to instance yes no yes no yes no yes no yes no yes no yes no

这个过程很多博文都介绍过,在此不再累赘.我们只提炼出里边需要我们注意的内容即可.

总结一下

  • 1,方法的调用都是通过objc_msgSend(receiver,SEL...)做到的,OC的方法中有两个默认值,self, _cmd
  • 2,方法在类中查找的过程中会优先去cache中,然后再去method_list查找,如果都没有,沿着继承链,递归查找
  • 3,如果在继承链上没有找到,那么就进入消息转发过程
  • 4,如果找到了,方法会被记录到cache中,方便下次查找
  • 5,其实在查找方法的过程中,Runtime还做了各种异常处理,比如class不存在,class没有初始化等等
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值