iOS 底层原理之 重识alloc流程(上)

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指针自然是在内存地址的第一位,用作寻址需要

当然了内存方面肯定不像我所说的这么简单,后续补充-中篇

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值