iOS NSObject对象的本质、内存分配、ISA指针及superclass底层源码分析 iOS NSObject对象是iOS开发中最基本也是最重要的对象之一,我们在使用它时往往只是停留在会用的阶段,却没有深入了解过它的本质。今天我们就来深入研究一下NSObject对象的本质、内存分配、ISA指针及superclass底层源码分析。 let's talk about NSObject对象的本质。在OC中,对象可以分为三种:实例对象(instance对象)、类对象(class对象)和元类对象(meta-class对象)。实例对象存储实例变量的值,类对象存储对象的信息、变量信息、实例方法、协议等,元类对象存储类方法对象。在底层,对象是转换为C++结构体来使用的。 例如,我们创建一个Dog类: ```objective-c @interface Dog : NSObject{ int age; int ID; int number; } @end @implementation Dog @end ``` 编译后,Dog类会被编译成以下结构体: ```c struct Dog_IMPL { struct NSObject_IMPL NSObject_IVARS; int age; int ID; int number; }; ``` 可以看到,NSObject_IMPL类型的结构体中只有一个isa指针,isa指针的作用后面会分析。 接下来,让我们来分析一下内存分配。我们使用的例子是Dog类,编译后的Dog结构体中有一个编译后的NSObject类型的结构体数据,因为它是继承于NSObject对象的。如果继承于其他对象的话,也会有一个其他对象的结构体数据在里面。 我们可以计算Dog类占用的内存大小: * NSObject_IMPL类型的结构体数据占用8个字节 * int类型的age变量占用4个字节 * int类型的ID变量占用4个字节 * int类型的number变量占用4个字节 因此,Dog类型的数据应该占用8 + 4 + 4 + 4 = 20个字节。 但是,系统给出的类的分配的空间大小为24字节(class_getInstanceSize方法),当实际使用的时候,给实例对象分配的大小达到了32字节(malloc_size方法)。这是为什么呢?我们从源码的角度来一个个分析。 class_getInstanceSize方法返回的是类的实例变量分配的大小空间,并且是内存对齐之后的大小,查看源码内容(苹果源码获取网站:https://opensource.apple.com/tarballs/),可以看到最终决定class_getInstanceSize大小的是word_align字节对齐方法,在这个方法中使用了字节对齐的方法来返回给类的变量实际分配的大小,我们根据方法的流程自己来算一下: `(x + WORD_MASK) & ~WORD_MASK;` 根据上面的计算流程,class_getInstanceSize其实是进行了一次8倍内存对齐的操作,所以为什么系统计算的class_getInstanceSize方法返回的是24自个想必各位已经很清楚了。 malloc_size方法返回的是对象的实例实际占用的内存大小,malloc_size和class_getInstanceSize一样也采取了内存对齐机制,只不过它使用的是16倍的内存对齐机制,就不做具体分析了。 值得一提的是,如果我们计算NSObjct大小的话,会发现malloc_size方法返回的是16字节,原因如下:OC的底层代码中对给对象分配的最小内存空间做了限制,限制最小为16字节,所以NSObject对象虽然仅仅有一个ISA指针,但是系统仍然会在实际使用他的实例对象的时候给他分配16个字节的空间。内存对齐机制是系统来决定的,这个机制提高了系统的性能和稳定性。 ISA指针是NSObject对象中最重要的指针之一,它指向对象的类对象,包含了对象的类信息、实例方法、协议等信息。在NSObject对象中,isa指针的作用是非常重要的,它决定了对象的类身份和继承关系。 在NSObject对象中,superclass指针也是非常重要的,它指向对象的父类对象,包含了父类的类信息、实例方法、协议等信息。在继承关系中,superclass指针起到了非常重要的作用,它决定了对象的继承关系和父类的信息。 我们可以看到,NSObject对象的本质、内存分配、ISA指针及superclass底层源码分析是非常复杂的,但是通过深入研究和分析,我们可以更好地理解和使用NSObject对象,提高我们的开发效率和程序的性能。
剩余14页未读,继续阅读
- 粉丝: 141
- 资源: 14
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- lanchaoHunanHoutaiQiantai
- (177377030)Python 爬虫.zip
- (177537818)python爬虫基础知识及爬虫实例.zip
- 自动驾驶横纵向耦合控制-复现Apollo横纵向控制 基于动力学误差模型,使用mpc算法,一个控制器同时控制横向和纵向,实现横纵向耦合控制 matlab与simulink联合仿真,纵向控制已经做好油门刹
- (178199432)C++实现STL容器之List
- (178112810)基于ssm+vue餐厅点餐系统.zip
- 两相步进电机FOC矢量控制Simulink仿真模型 1.采用针对两相步进电机的SVPWM控制算法,实现FOC矢量控制,DQ轴解耦控制~ 2.转速电流双闭环控制,电流环采用PI控制,转速环分别采用PI和
- VMware虚拟机USB驱动
- Halcon手眼标定简介(1)
- (175128050)c&c++课程设计-图书管理系统