alloc底层原理

270 阅读1分钟

Person * obj = [[Person alloc] init]; alloc做了什么? init又做了什么?

Alloc做了什么?

地址空间的创建 

步骤如下:

  • cls -> instanceSize 计算内存申请的大小
  • calloc 向系统申请开辟内存,返回地址指针
  • obj -> initInstanceIsa 关联类(类和地址指针绑定)

init做了什么?

return (id)self init没有开辟内存的功能, 它用于构造方法, 工厂设计等返回对象

alloc流程图

Tips

字节对齐:

内存安全,方便读取。 alloc产生的内存空间会进行16字节对齐

p = [object alloc];// 8字节
p.name = "xiaoming"; // 8字节
p.nickname = "xm" // 8字节
由于是16字节对齐, 以上会开辟一共32字节的内存空间.

常用指令:

  • bt 查看堆栈信息

  • p 查看对象信息

  • p/t 二进制打印对象信息

  • po p+description

  • x address 查看地址的内存情况(memory read)

  • x/4gx address 以16进制打印 4行排版

  • x/8gx address 以16进制打印 8行排版

参考:

juejin.cn/post/697022…