二十六、Runtime之(十)方法-objc_msgSend()阶段3-消息转发-源码解析01

一、消息转发

1.动态解析阶段,并没有添加方法,当再次retry时,仍找不到方法,这个时候,就不会走动态方法解析,而是走消息转发阶段

二十六、Runtime之(十)方法-objc_msgSend()阶段3-消息转发-源码解析01_第1张图片
objc_msgForward_impcache

2.执行 forwarding方法,内部会调动forwardingTargetForSelector方法,通过获取返回值,调用msgSend方法,执行被转发对象的方法。
二十六、Runtime之(十)方法-objc_msgSend()阶段3-消息转发-源码解析01_第2张图片
__forwarding__

3.消息转发的代码实现
二十六、Runtime之(十)方法-objc_msgSend()阶段3-消息转发-源码解析01_第3张图片
消息转发的代码实现

二、方法签名

1.如果不实现forwardingTargetForSelector,或者实现forwardingTargetForSelector,返回值为nil,则会走methodSignatureForSelector方法。


二十六、Runtime之(十)方法-objc_msgSend()阶段3-消息转发-源码解析01_第4张图片
forwardingTargetForSelector

2.方法签名的代码实现


二十六、Runtime之(十)方法-objc_msgSend()阶段3-消息转发-源码解析01_第5张图片
方法签名的代码实现

3.NSInvocation


二十六、Runtime之(十)方法-objc_msgSend()阶段3-消息转发-源码解析01_第6张图片
NSInvocation

objc_msgSend()执行流程03-消息转发的流程示意图

二十六、Runtime之(十)方法-objc_msgSend()阶段3-消息转发-源码解析01_第7张图片
objc_msgSend()执行流程03-消息转发

你可能感兴趣的:(二十六、Runtime之(十)方法-objc_msgSend()阶段3-消息转发-源码解析01)