Runtime系列:Class的结构【03】

简介: Runtime系列:Class的结构

通过isa、superclass指针指向中,我们知道了,isa、superclass的作用,接下来继续详细了探寻下Class结构其他成员变量的作用。Class的底层结构图如下图:

d50380ded88044f1bec95bd41139c9ff.png


1、bits类信息


1.1、class_rw_t结构

class_rw_t结构通过 bits 变量与 FAST_DATA_MASK 的位&运算,获取到:


class_rw_t* data() {
    return (class_rw_t *)(bits & FAST_DATA_MASK);
}


class_rw_t里面的methods、properties、protocols是二维数组,是可读可写的,包含了类的初始内容、分类的内容


846a2a1f741e43799bbf0557634c65f6.png


1.2、class_ro_t结构

class_ro_t 里面的baseMethodList、baseProtocols、ivars、baseProperties是一维数组,是只读的,包含了类的初始内容

3a3b9b5db4cc4748877d30aa081f94b5.png


1.3、method_t结构

method_t 是对方法\函数的封装

34c4d4d674e74201a37fdfe307355008.png


1、IMP代表函数的具体实现

8428087cf17d4d34bc9a166bd0c238e1.png


2、SEL代表方法\函数名,一般叫做选择器,底层结构跟char *类似

可以通过@selector()和sel_registerName()获得。

可以通过sel_getName()和NSStringFromSelector()转成字符串。

不同类中相同名字的方法,所对应的方法选择器是相同的

d1766ef44bdd4312b77483eb0f520b1d.png


3、types包含了函数返回值、参数编码的字符串

36e05acedb9b48ecb2505a35cedc617e.png

Type Encoding:

iOS中提供了一个叫做@encode的指令,可以将具体的类型表示成字符串编码


b73b9c7941804d2fab5a730acc68ee70.png

217b39a609f24e0b9f1dc0889df18733.png

2、cache_t 方法缓存列表


Class内部结构中有个方法缓存(cache_t),用散列表(哈希表)来缓存曾经调用过的方法,可以提高方法的查找速度。

e30a8876c28148188b7da7b1c53d836f.png

哈希表:本质是用空间换时间,在iOS中采用位&运算来取值赋值。


相关文章
|
5月前
|
SQL JSON Java
Java【问题记录 02】对象封装+固定排序+list All elements are null引起的异常处理+Missing artifact com.sun:tools:jar:1.8.0
Java【问题记录 02】对象封装+固定排序+list All elements are null引起的异常处理+Missing artifact com.sun:tools:jar:1.8.0
43 0
|
10月前
|
消息中间件 Java RocketMQ
【Java】Error creating bean with name ‘functionBindingRegistrar‘ defined in class path resource的一种解决方式
【Java】Error creating bean with name ‘functionBindingRegistrar‘ defined in class path resource的一种解决方式
51 0
|
11月前
|
Java
Java通过File获取Class字节码并构造Class对象
Java通过File获取Class字节码并构造Class对象
121 0
|
Java
java:How to use code block?(Detailed)
This article will share something about java's code block. Very detailed, I promise.
66 0
java:How to use code block?(Detailed)
无法为JSP编译类:无法解析类型java.util.Map $ Entry从所需的.class文件间接引用它
无法为JSP编译类:无法解析类型java.util.Map $ Entry从所需的.class文件间接引用它
|
Java
jar的MANIFEST.MF配置了Class-Path, java -classpath设置无效
jar的MANIFEST.MF配置了Class-Path, java -classpath设置无效
157 0
|
安全 Java API
java基础 之 从Class.forName()跟.class的区别看类的初始化
java基础 之 从Class.forName()跟.class的区别看类的初始化
81 0
|
Java Spring
FileSystemResource和ClassPathResource有何区别?
FileSystemResource和ClassPathResource有何区别?
FileSystemResource和ClassPathResource有何区别?
|
Java
Java中class与Class的区别
Java中class与Class的区别
127 0
Java中class与Class的区别
|
XML JSON 数据格式
No converter found for return value of type: class java.util.ArrayList错误问题
No converter found for return value of type: class java.util.ArrayList错误问题
No converter found for return value of type: class java.util.ArrayList错误问题