iOS 底层原理,对象创建 alloc 详析, 内存申请(内存对齐规则),以及内存开辟(malloc)

1,069 阅读2分钟

由上一节,我们知道了alloc的流程,这里对这个流程进行详析

1、分析目标 获取所需内存

方法 `size = cls->instanceSize(extraBytes);`

2、分析目标 开辟内存,返回地址指针

obj = (id)calloc(1, size);

调试工具 LLDB

1、打印内存地址 x 对象 表示以16进制打印对象地址 0x 16进制

对象地址查看方式,小端对齐

大概就是 从右向左读。

2、读写常用指令

读取寄存器的值

register read/格式
register read/x

修改寄存器的值

register write 寄存器名称 数值
register write rax 0 (将0写入到rax寄存器里面)

读取内存中的值:

x/数量-格式-字节大小 内存地址
x/3xw 0x0000010
(x就是memory read的意思)

修改内存中的值

memory write 内存地址 数值
memory write 0x0000010 10

格式

x是16进制,f是浮点,d是十进制

字节大小

b – byte 1字节
h – half word 2字节
w – word 4字节
g – giant word 8字节

expression 表达式

可以简写:expr 表达式
expression $rax
expression $rax = 1

po 表达式

print 表达式
po/x $rax
po (int)$rax

内存对齐

对象的底层是结构体,这里我们研究结构体的内存对齐

sizeof、class_getInstanceSize、malloc_size

sizeof 是一个运算符,在编译时就可以获取类型所占内存的大小

class_getInstanceSize:依赖于<objc/runtime.h>,返回创建一个实例对象所需内存大小

malloc_size:依赖于<malloc/malloc.h>,返回系统实际分配的内存大小

内存对齐原则

  • 1:数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,第 一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要 从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组, 结构体等)的整数倍开始(比如int为4字节,则要从4的整数倍地址开始存 储。 min(当前开始的位置mn)m=9n=4 9 10 11 12
  • 2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从 其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b 里有char,int ,double等元素,那b应该从8的整数倍开始存储.)
  • 3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大 课程研发:Cooci老师 成员的整数倍.不足的要补⻬。

参考 www.jianshu.com/p/7e4dcc768…