返回
iOS底层学习-类的原理剖析(下)
IOS
2023-10-22 19:52:23
iOS底层学习之旅仍在继续,让我们进一步探究类的奥秘,探索类内存的ro数据,深入理解属性、方法和成员变量在内存中的分布与运作方式。
一、类内存的ro数据
在上一章节,我们分析了类的属性和方法。那么,成员变量呢?
通过打印class_rw_t的properties(),我们发现只有类的属性,并没有成员变量。这不禁让人疑惑,成员变量究竟存储在哪里?
带着疑问,我们继续深入探索。
二、类内存的rw数据
除了ro数据,类内存中还有rw数据,即读写数据。
rw数据主要包括成员变量和实例变量。
1. 成员变量
成员变量是类的所有实例共享的数据,存储在类的ro数据区中。
我们可以通过class_getInstanceVariable()函数来获取成员变量的列表。
const char *name = class_getInstanceVariable(cls, i);
其中,cls是类的指针,i是成员变量的索引。
2. 实例变量
实例变量是类的每个实例独有的数据,存储在类的rw数据区中。
我们可以通过object_getInstanceVariable()函数来获取实例变量的列表。
const char *name = object_getInstanceVariable(obj, i);
其中,obj是实例对象的指针,i是实例变量的索引。
三、类内存布局
至此,我们已经了解了类内存的ro数据和rw数据,那么,它们在类内存中是如何布局的呢?
类内存布局如下图所示:
+--------------------+
| Method Cache |
+--------------------+
| Class Name |
+--------------------+
| Super Class |
+--------------------+
| Protocols |
+--------------------+
| Instance Variables |
+--------------------+
| Property |
+--------------------+
| Method |
+--------------------+
从上图可以看出,类内存主要分为以下几个部分:
- Method Cache:方法缓存,存储着最近调用的方法。
- Class Name:类名。
- Super Class:父类。
- Protocols:协议列表。
- Instance Variables:实例变量。
- Property:属性列表。
- Method:方法列表。
四、总结
至此,我们已经全面地了解了类的内存结构,包括ro数据和rw数据,以及它们在类内存中的分布与运作方式。
理解类的内存结构对于深入理解iOS底层实现原理具有重要意义。
希望本篇文章能够帮助大家进一步掌握iOS底层知识。