runtime源码之方法实现过程

主要内容:

一:什么是 runtime?

二:对象与方法的本质

三:runtime源码解析-消息发送

四:runtime源码解析-动态方法解析

五:runtime源码解析-消息转发


一、什么是 runtime?

都说 Objective-C 是一门动态语言。首先,动态与静态语言最大的区别,就是动态语言将数据类型的检查等决策尽可能地从程序编译时推迟到了运行时。只要有可能,runtime 就会动态地完成任务。这意味着 Objective-C 语言不仅需要编译器,还需要 runtime 来执行编译代码。

runtime 是一套用C语言提供的 API,Objective-C 代码最终都会被编译器转化为运行时代码,通过消息机制决定了不同函数调用或转发方式,因此 runtime成为了 Objective-C 作为动态语言使用的基础

runtime三种调用方式:

1:runtime api

2:NSObject api

3:OC上层通过@selector

runtime源码下载


二:对象与方法的本质

编译: clang -rewrite-objc main.m -o main.cpp

方法
方法调用的本质objc_msgSend,发送消息



三:runtime源码解析-方法查找过程

id objc_msgSend(id self, SEL _cmd, ...),方法查找主要有两种方式

1:快速查找(混编)

汇编找不到,通过__class_lookupMethodAndLoadCache3跳到C语言里面查找

2:慢速查找(C C++)

通过lookUpImpOrForward方法查找

下面是方法查找isa的经典走位图

四:runtime源码解析-动态方法解析

源码过程,两次是因为最后消息无法处理,系统会重现调用方法决议,

五:runtime消息转发流程

1:- (void)forwardInvocation:(NSInvocation*)anInvocation 快速转发

2:- (NSMethodSignature*)methodSignatureForSelector:(SEL)aSelector 慢速转发

3:- (void)forwardInvocation:(NSInvocation*)invocation 重定向

消息转发流程图

第一次写,如有错误,请谅解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容