1.首先通过断点查看objc_msgSend调用,在调用方法处设置断点,在菜单栏中选择Debug -> View Debugging -> 勾选Always Show Disassemble
运行程序会停留在下面断点位置
停留的断点位置.png
然后在Debug控制台中,按住control并点击Step into继续跳转
进入objc_msgSend内部
objc_msgSend内部.png
继续调试查看
objc_msgSend_uncached.png
_class_lookupMethodAndLoadCache3.png
我们会发现调用顺序objc_msgSend -> _objc_msgSend_uncached -> ::_class_lookupMethodAndLoadCache3(id, SEL, Class)(这个应该是c++方法了) -> ...
2.我们从源码分析
全局搜索_objc_msgSend,如下图
_objc_msgSend汇编源码.png
从汇编语言里找bl子程序跳转
// receiver and selector already in x0 and x1
mov x2, x16
bl __class_lookupMethodAndLoadCache3
// IMP in x0
mov x17, x0
会发现也是这个方法__class_lookupMethodAndLoadCache3跟断点调试一样很明显这个是跳转到c++方法(源码如下),然后接iOS底层 消息查找流程
IMP _class_lookupMethodAndLoadCache3(id obj, SEL sel, Class cls)
{
return lookUpImpOrForward(cls, sel, obj,
YES/*initialize*/, NO/*cache*/, YES/*resolver*/);
}