美文网首页
objc_msgSend分析

objc_msgSend分析

作者: CS_SDN | 来源:发表于2019-12-29 22:23 被阅读0次

前言

Runtime:

它是由C、C++、汇编混合写成的,为OC提供运行时功能的一套API。(切忌面试时说成Runtime就是运行时,太low)

由于OC的底层是C和C++,而C、C++都属于静态语言,OC作为高级的动态语言,归根结底于Runtime运行时。

拓展:
*汇编是最接近机器语言的一种语言
*LLBM

运行时:整个程序运行时,将整个代码加载到内存中

编译时:com+b编译的时候做的一些翻译的工作,这些翻译的工作包括:语法,将这些翻译成机器容易识别的语言能够进行中间的连接。

大致流程:product—>app—>show in Finder—>显示包内容—>可执行文件


图片.png

再对其进行 show in Finder


图片.png 图片.png

Runtime的应用

图片.png
图片.png

只有以上这三种使用方式,除此之外没有了,但是每种方式中衍生到的方法又有很多种。
例如:第二种方式,NSObject中的方法


图片.png

方法的本质探索:objc_msgSend

图片.png

探索案例:

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        LGStudent *s = [LGStudent new];
        [s sayCode];
        // 方法调用底层编译
        // 方法的本质: 消息 : 消息接受者 消息编号 ....参数 (消息体)
        objc_msgSend(s, sel_registerName("sayCode"));
        
        // 类方法编译底层
//        id cls = [LGStudent class];
//        void *pointA = &cls;
//        [(__bridge id)pointA sayNB];
        objc_msgSend(objc_getClass("LGStudent"), sel_registerName("sayNB"));

        // 向父类发消息(对象方法)
        struct objc_super lgSuper;
        lgSuper.receiver = s;
        lgSuper.super_class = [LGPerson class];
        objc_msgSendSuper(&lgSuper, @selector(sayHello));

        //向父类发消息(类方法)
        struct objc_super myClassSuper;
        myClassSuper.receiver = [s class];
        myClassSuper.super_class = class_getSuperclass(object_getClass([s class]));// 元类
        objc_msgSendSuper(&myClassSuper, sel_registerName("sayNB"));
 
        
    }
    return 0;
}

在类方法向父类发送消息这种情况中仍然遵守isa走向规律


图片.png

方法的查找顺序:
isa-类
cache_t - bucket
方法-bit-rw-ro-methodList

探索思路:

1.为什么要用objc_msgSend来编写?
C语言的静态弊端
objc_msgSend快
2.objc_msgSend自身也有慢速路径,也是通过C来实现


图片.png

objc_msgSend作用流程

图片.png

作用流程部分,后面会加上具体的代码实现分析~

相关文章

网友评论

      本文标题:objc_msgSend分析

      本文链接:https://www.haomeiwen.com/subject/ndmuoctx.html