前言
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
作用流程部分,后面会加上具体的代码实现分析~












网友评论