本文章是在学习ios底层对象原理过程中的记录
前言
众所周知在Objective-C(简称OC)开发中最基本的就是用alloc和init方法来初始化对象,但是在我们日常开发中这个对象创建的最基本最简单的操作我们只知道怎么使用,并不知道里面的底层到底做了什么,这就是这篇文章的以下需要介绍的alloc底层原理。
资料准备
alloc探索思路
探索之前我们看一组对象,并且打印他们的内存地址和对象指针
上图我们可以看出,三个类的对象地址相同,对象指针不同,出现这样的结果,为什么,OC底层内存是如何创建这几个类的等一系列问题?下面我们就一起探究下:
常用的探索手法主要有以下四种
- 断点跟进 control + in 方法
- Symbolic Breakpoint 符号断点:libobjc.A.dylib`+[NSObject alloc] 或者全局搜索alloc{
- 菜单Debug -> Debug Workflow -> Always show Disassembly 查看汇编代码
- 源码跟进
我们先对前三种方式进行探究
- control方法,断点位置
按住control键,出现
由
变成
点击上方红色按钮出现下图
继续点击
由图看出objc_alloc是在libobjc.A.dylib动态库创建的
同理
- 符号断点
输入alloc
会有很长的alloc出现,我们直接过掉断点就可一看到我们alloc的动态库
- 汇编
菜单Debug -> Debug Workflow -> Always show Disassembly 查看汇编代码
第22行打断点,按住control键,和control + in方式一样,可以跳转至下图:
源码跟进
下载源码并配置(Github上有配置好的源码,我们直接下载使用就可以)
- alloc
- _objc_rootAlloc
- callAlloc
- _objc_rootAllocWithZone
- _class_createInstanceFromZone
我们看到这个方法实现的时候,只有size这个是有关内存大小的,打印size
上图可看出size的大小出来了,那再探究它是怎么算出来的
- fastInstanceSize
-
align16 看到下面的这个算法(字节对齐)
-
(x + 15) & ~15
注:
16字节对齐:以空间换取时间,下一篇主要研究字节对齐
以上alloc的探索过程,用流程图梳理下
小知识
* init方法和new方法源码查看
上图可看出new方法是由 (alloc + init)方法构成
对象属性在内存中的布局
1. register read : 返回当前线程通用寄存器的值(对64为对应x0-x31)
2.x/4xg object :当前地址分为4段,以16进制进行打印,每段8个字节大小