alloc探索

alloc初探

我们运行如下代码:


image.png

通过控制台,我们可以看到打印结果如下:


image.png

可以看到打印的是同一个对象,不同的只是它们的指针地址(右边箭头所示),指向同一块内存0x600002946760(左边箭头所示)。说明alloc就是在创建对象了,哪对象创建的具体过程是怎样的呢?这时就要查看alloc的源码实现了。
选中alloc并点击Jump to Definition 或者control+command+alloc 然后选中NSObject并跳转进去,发现只有alloc方法的声明:
image.png

怎么办呢?这里教大家一些方法:
1、control+Step into


image.png

2、通过汇编查看(Debug--->DebugWorkflow--->Always show Disassembly)
image.png

这里我们使用第一种方式,如图所示:
image.png

发现这里调用的是objc_alloc,我们添加一个符号断点看一下:
image.png

发现是libobjc.A.dylib,接下来就要开始探究libobjc

libobjc源码探索

运行代码,并添加符号断点objc_alloc,它会进入objc_alloc,如图:


image.png

接下来会进入callAlloc(第一次)


image.png

一步步往下走,发现这里进行了一次objc_msgSend
image.png

搜索alloc,如图:


image.png

进入_objc_rootAlloc,如图:
image.png

又来到了callAlloc这个方法中(第二次),两次参数不同
image.png

进入_objc_rootAllocWithZone(cls, nil),如图:
image.png

进入_class_createInstancesFromZone,如图:
image.png

这里面都进行了哪些操作呢?这里我们来看一下:
1、计算需要开辟的内存大小,同时进行了字节对齐(16字节)


image.png

2、根据计算的大小去申请内存
image.png

3、将对象与申请的空间进行绑定并返回
image.png

下面是流程图:
image.png

你可能感兴趣的:(alloc探索)