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
网友评论