APP & program

iOS Runtime之方法查找

2022-06-23  本文已影响0人  谢二九

Runtime系列导读

介绍

OC是一门动态性比较强的编程语言,允许很多操作推迟到程序运行时再进行。
OC的动态性就是由Runtime来支撑和实现的,Runtime是一套C语言的API,封装了很多动态性相关的函数平时编写的OC代码,底层都转换成Runtime API(主要是objc_msgSend和objc_msgSendSuper)进行调用。
我们可以利用Runtime做以下具体场景应用:

方法存储

实例对象与类的关系

定义

科普下实例对象(instance)、类(class)、元类(meta-class)。

综上总结,类是实例对象的描述,元类是类对象的描述。

模型

实例对象的存储结构(以NSObject实例对象举例):

struct NSObject_IMP{
  Class isa;
}

其中,isa是指向NSObject类的指针。

类对象的存储结构

struct objc_class {
    Class _Nonnull isa;
    Class _Nullable super_class;
    struct objc_ivar_list * _Nullable ivars;
    struct objc_method_list * _Nullable * _Nullable methodLists;
    struct objc_cache * _Nonnull cache;
    struct objc_protocol_list * _Nullable protocols;
    ...
}

其中,

关系

通过源码分析,可以确认实例对象、类和元类是以下关系:

消息发送

消息发送从类对象或者元类的方法列表缓存和方法列表中查,没有则通过super指针逐级向上,有则缓存并调用。

动态方法解析

开发者可以实现以下方法,来动态添加方法实现:

动态解析过后,会重新走“消息发送”的流程,“从receiverClass的cache中查找方法”这一步开始执行。

消息转发

延伸问题

上一篇下一篇

猜你喜欢

热点阅读