主要内容:
一:什么是 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
二:对象与方法的本质
编译: 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 重定向
消息转发流程图第一次写,如有错误,请谅解
网友评论