首先是runtime 的概念
RunTime简称运行时,就是系统在运行的时候的一些机制,其中最主要的是消息机制。
runtime的运行机制
先看下类对象的定义
typedef struct objc_class *Class;struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
#if!__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
接下来看一个实例方法的调用都经历了什么?
Person *p = [[Person alloc] init];
[p eat];
编译后实际是这样
objc_msgSend(p, selector)
官方文档
id objc_msgSend(id self, SEL op, ...)
参数
self 消息的接收者
op 消息的selector,一个C的字符串用来定位
… 消息传入参数的数组
接下来就是查找这个消息执行体
就是这一行
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
OC的对象通过isa找到类对象,类对象查找自己存储的方法列表来找到对应的方法执行体,方法执行体执行具体的代码,并返回值给调用者。
类方法又是如何处理的?
可以看得到这一行
Class isa OBJC_ISA_AVAILABILITY;
这个isa指向的一个Class类型,就是保存了类方法的地方。这个Class类型的东西就是类元对象,类元对象会查找自己存储的方法列表来找到对应的方法执行体