Runtime系列(浅析数据结构)

移动开发
上篇文章说到类与元类,我们已经知道类的本质是结构体objc_class,接下来看看objc_class是什么

上篇文章说到类与元类,我们已经知道类的本质是结构体objc_class,接下来看看objc_class是什么

objc_class.png

isa指向元类,super_class表示当前类的父类,这两个成员我们已经很熟悉,这里不再赘述(可参考 类与元类 、 引文)。

name:类名
version:版本相关信息,默认为0
info:提供运行期使用的标示符
instance_size:当前类实例变量的大小(包括父类)

  • ivars
    从objc_class可以看到,ivars是结构体objc_ivar_list的指针

objc_ivar_list and objc_ivar.png

结构体各成员见名知意,不再逐个解释。可见,ivars其实是一个存储类中成员变量相关信息的链表。
其中

Ivar.png
  • methodLists
    从objc_class可以看到,methodLists是结构体objc_method_list的二级指针

objc_method_liist and objc_method.png

又见结构体的自嵌套,可见methodLists也是链表,存储类中的方法相关信息。由于是二级指针,所以可以动态修改类中的方法,这也是分类的实现原理。
其中

Method.png

这里要解释一下SEL和IMP:

  • SEL
    • 什么是SEL
      SEL是对方法的包装,常见的定义有
      SEL sel1 = @selector(message1);
      SEL sel2 = NSSelectorFromString(message2);
    • 为什么要对方法进行包装
      获取方法所对应的ID
    • 什么是方法对应的ID
      可以理解为方法名的一种映射

来看下面的例子

- (void)helloWorld:(int)flag;
- (void)helloWorld:(float)flag;

在OC中,这样写会报错,错误类型为重复声明。如果这样写:

- (int)helloWorld:(int)flag;
- (float)helloWorld:(float)flag;

即使返回值不同,仍然是重复声明。因为他们的方法名相同,都是helloWorld:,所以这四个方法对应着同一个SEL。
不过这是在同一个类中,如果是不同的类呢?
无论是在同一个类还是在不同的类,只要方法名相同,SEL就相同,获取的ID就相同。

既然方法名相同ID就相同,如果两个非继承关系的类存在相同方法名的方法,那该如何确定执行那个类中的方法?
再来回顾引文提到的函数

id objc_msgSend(id self, SEL op, ...)

[receiver message]还有个接受者,即使ID相同,不同的接收者定位到的方法仍然不同,而各类中不允许存在相同方法名的方法,这样就确定了***性。

  • IMP
    相比于SEL,IMP要爽快得多。IMP的本质是函数指针,直接通过IMP就可以找到各个方法。这样效率更高,因为绕过了消息传递阶段,直接定位。

回到objc_class。
cache和protocols不再深入,这里只做简单介绍

  • cache
    cache同样是链表,存储曾经调用过的方法的相关信息,这样将常用方法存到cache中,可以提高方法的查找效率。
  • protocols
    protocols仍然是链表,存储当前类(包括父类)遵守的协议的相关信息。
责任编辑:倪明 来源: 简书
相关推荐

2023-11-12 21:49:10

Redis数据库

2009-08-11 14:51:11

C#数据结构与算法

2020-12-17 10:12:33

数据结构算法队列

2009-08-11 14:43:42

C#数据结构与算法

2009-08-11 14:30:32

C#数据结构与算法

2009-08-11 14:14:42

C#数据结构与算法

2011-03-31 15:41:51

Cacti数据表结构

2023-10-31 08:51:25

数据结构存储数据

2012-04-28 14:21:47

Java数据结构线性结构

2021-04-19 09:08:19

无向图数据结构

2021-05-12 14:09:35

链表数据结构线性结构

2020-10-21 14:57:04

数据结构算法图形

2020-10-17 11:14:19

数据结构与算法系列

2021-08-03 10:24:59

数据跳跃链表结构

2009-08-11 14:36:17

C#数据结构与算法线性表

2021-06-17 09:36:07

鸿蒙HarmonyOS应用

2021-10-12 07:58:10

MySQL索引数据

2021-07-16 07:57:34

Python数据结构

2023-07-03 17:24:33

数据结构

2014-12-10 10:35:43

微信 数据结构
点赞
收藏

51CTO技术栈公众号