返回

iOS底层学习-类的原理剖析(下)

IOS

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底层知识。