runtime 的快速理解与使用

首先是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类型的东西就是类元对象,类元对象会查找自己存储的方法列表来找到对应的方法执行体

你可能感兴趣的:(runtime 的快速理解与使用)