iOS 底层原理之 重识alloc流程
学习前提:想要了解alloc得基本流程,源码必然是少不了得,我选的是objc-818.2
苹果源码汇总 ,拿走不谢
流程图
首先先展示一下基本的流程图,当然其实有一些情况没有列举出来,欢迎给予意见
开干!
导入源码后,首先创建一个基本对象YCXPerson,再alloc得时候断点,一步步查看里面的执行步骤
说到这里就不得不介绍一下比较好用的一种断点方式了
先用符号断点alloc 然后设置总是显示汇编代码 编辑后就会看到汇编代码 然后再CTRL+step into 这样可以清楚的知道各个函数准确的执行流程
运行之后所看到的汇编代码,旁边会有注释下一步会走到那个函数当中
当然整个流程最核心的地方就是下面2处
图一
if (slowpath(checkNil && !cls)) return nil;
if (fastpath(!cls->ISA()->hasCustomAWZ())) {
return _objc_rootAllocWithZone(cls, nil);
}
是确定该类的创建是否已经有缓存了,有的话就不需要走下面的allocWithZone和alloc
图二则是创建该类的对象,具体需要执行的内容,依次为
1.获取类的信息
2.计算所需内存大小
3.开辟内存空间
4.关联isa指针
最开始的流程图其实已经有标注了,图中也有注释
说到计算所需内存大小,all objects be at least 16 bytes.所有对象至少16字节
保证8字节对齐
以上是关于内存计算方面的一些细节,当然这里面涉及要一些运算,我们也可以自己给类赋予一些属性,然后断点自己计算一下,当然说到这里就需要我们熟悉一些常用的lldb指令,以及对于汇编代码有所了解了,本文就不过多介绍
以下是我目前所总结的一些计算原理,当然可能并不准确
内存计算
首先我们要知道我们OC的对象,其实就像是结构体,包含了各种属性对象,那么自然所需内存大小和自身属性有关,再加上isa指针固定8字节,而内存的存储原则是需要8字节对齐的,这是为了更加高效的读取内存信息,所有系统会会对象各种属性的大小会进行一定的优化排列,再确保8字节对齐的情况下,尽量节省空间,比如2个4字节的对象属性,如果是连在一起的,那么就可以共享8字节空间,也不会影响读取效率,同时isa指针自然是在内存地址的第一位,用作寻址需要
当然了内存方面肯定不像我所说的这么简单,后续补充-中篇