1.alloc底层探究

417 阅读1分钟

嘘,别说话,吻我(开搞)

一、起因

从一段代码说起 image.png

结果: image.png

3个不同的指针(地址相差8个字节)指向同一块内存区域

注:%@-obj1 打印对象的类型以及内存地址

%p-obj1 打印对象的内存地址

%p-&obj1 打印对象的指针

疑问:

1.alloc做了什么事情?

2.init又做了什么?

3.怎么读取这些函数的源码?

二、三种断点的方式(让源码浮出水面)

1.符号断点

①、先在alloc函数加断点

②、然后按住control 再点击 step into 按钮(可以多次点击)

③、此时断点来到此处(可以看到实现函数objc_alloc) image.png

④、在objc_alloc上加符号断点 image.png

⑤、大功告成(可以看到实现是在 libobjc.A.dylib 库中的 _objc_rootAllocWithZone 函数中)

2.汇编

①、先在alloc函数加断点

②、勾选Debug-Debug Workflok-Always Show Disassembly

③、当走到 objc_alloc 时 按住control 点击step into,此时走到 objc_alloc函数,接下来也是符号断点(同方式一种的) image.png

3.已知符号断点

①、直接符号断点 alloc image.png

此时,已经知道源码的位置了,然后去苹果官网去下载就好 opensource.apple.com

配置好的源码github.com/wangshaofen…

三、编辑源码,可以查看到alloc的流程

image.png

1.编译器优化

image.png

image.png

2.instanceSize(计算内存大小)

image.png 然后进入计算方式

image.png

eg: (x + WORD_MASK) & ~WORD_MASK (8+7)&(~7) 15: 0000 1111 7 : 0000 0111 ~7: 1111 1000 15&(~7): 0000 1000 = 8也就是8字节对齐

通过代码可知,苹果内部是8字节对齐计算内存的,分配内存的时候是以16字节的对齐进行分配的