前言: Objective-C语言作为我们从事iOS开发的主要语言之一,面向对象是其中一大特性,那么到底什么是OC对象呢?我们对它真的很熟悉吗?我认为很多从事iOS开发的人,并不一定能从更深的层次去回答它。那么接下来,就让我们一步一步的去揭开它神秘的面纱吧!
本篇内容:OC对象的本质
推荐关联文章:isa的分析
一、OC对象与结构体的关系?
- 我们都知道,Objective-C的底层都是通过C/C++来实现的,所以OC中的对象也会转化成C/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。
分析:可以看到编译后的方法,都被注释掉,实际参与计算大小的部分,还是成员变量部分,所以类中添加实例化方法和类方法,都不会影响对象大小和对象占用的内存大小。