由上一节,我们知道了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老师 成员的整数倍.不足的要补⻬。