iOS底层 objc_msgSend分析

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*/);
}

你可能感兴趣的:(iOS底层 objc_msgSend分析)