OC对象原理探究(下)—— OC对象的本质

761 阅读3分钟

前言: Objective-C语言作为我们从事iOS开发的主要语言之一,面向对象是其中一大特性,那么到底什么是OC对象呢?我们对它真的很熟悉吗?我认为很多从事iOS开发的人,并不一定能从更深的层次去回答它。那么接下来,就让我们一步一步的去揭开它神秘的面纱吧!


本篇内容:OC对象原理探究(下)—— OC对象的本质

PS:推荐文章

《OC对象原理探究(下)—— isa的分析》

《OC对象原理探究(下)—— 联合体(共用体)与位域》


一、OC对象与结构体的关系?

  • 我们都知道,Objective-C的底层都是通过C/C++来实现的,所以OC中的对象也会转化成C/C++中的某一个数据结构,然后再编译为汇编代码,最终转化为机器可以识别的二进制代码。 Objective-C执行过程
  • 通过以下编译命令
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main.cpp
  • 将main.m转换为main.cpp文件 在这里插入图片描述

  • 查看C++文件,我们可以看到类的结构 在这里插入图片描述

  • Class的定义,是一个结构体指针类型 在这里插入图片描述

  • 通过class_getInstanceOfSize(cls)和malloc可以查看对象的大小和系统实际开辟了多少内存给对象。 在这里插入图片描述

  • 通过函数我们得知,NSObject对象的大小(实际就是isa指针大小),为8字节,实际开辟内存空间16字节。

综上,NSObject对象的底层实现,实际上是一个包含isa(指向一个结构体指针的objc_class类型)的结构体NSObject_IMP。

二、OC对象大小成员变量的关系?

  • 创建一个YTPerson类,继承自NSObject。 在这里插入图片描述

  • 编译成C++代码后的YTPerson实际上是结构体YTPerson_IMP。 在这里插入图片描述

通过结构体的内存对齐原则(见OC底层探究中)分析,当前结构体YTPerson_IMP大小为:8x5=40字节,按照对象内存对齐原则,以16字节对齐计算内存为:16x3 = 48字节。

  • 在main.m分别打印对象占用大小和对象内存空间大小。 在这里插入图片描述

分析:

1、YTPerson对象与 YTPerson_IMP结构体大小与占用内存空间大小一致。

2、对象内的成员变量的大小,决定了对象实际占用的内存空间。

三、对象大小与方法的关系?

  • 同样,对YTPerson对象添加实例化方法和对象方法. 在这里插入图片描述
  • 再次打印YTPerson的相关值: 在这里插入图片描述
分析:方法的添加对YTPerson的大小和占用内存大小,没有任何影响,说明添加方法的数量对OC对象的大小没有影响。
  • 为什么方法的添加没有对OC对象产生影响呢?让我们分析下添加完方法后的结构体YTPerson_IMP。 在这里插入图片描述
分析:可以看到编译后的方法,都被注释掉,实际参与计算大小的部分,还是成员变量部分,所以类中添加实例化方法和类方法,都不会影响对象大小和对象占用的内存大小。

四、总结概述

  • 1、OC对象的底层实现是结构体。

  • 2、OC对象中成员变量的大小影响着对象的大小和对象占用内存空间大小。

  • 3、OC对象中实例化方法和类方法,对其大小以及占用内存大小,没有影响。

关于OC对象本质的分析,到这里开始拉开帷幕,如果喜欢我的文章,请关注我,后面将开始另外一个重要东西 —— 《OC对象原理探究(下)—— isa的分析》