我们在日常开发中都知道alloc的功能是给对象来分配内存的,但是具体底层怎么实现很少有人去探究,接下来我们通过源码加汇编的结合来分析alloc的底层实现。
在学习alloc之前要知道一下runtime是什么,runtime的字面意思是运行时,runtime具体是指由C、C++、汇编实现的一套API,从OC到C语言的过渡增加了运行时功能。
一、给alloc添加断点调试:
首先以一个Person的类为例来讲:
Person *obj = [Person alloc];
调用alloc方法,实际上是runtime使用objc_msgSend进行消息转发来实现的方法,接下来来给alloc加上一个全局断点:

二、一步步分析objc源码
运行应用断点会来到alloc的汇编分析:

从这两行汇编代码中可以看出来,alloc实际上调用的是libobjc里的_objc_rootAlloc方法,接下来查看官方objc源码(苹果官网opensource里下载)来找到这个方法.

从alloc源码方法里可以看到跟在汇编里调用的方法都是_objc_rootAlloc,接下来再进去_objc_rootAlloc方法看:

由上可以看到_objc_rootAlloc方法的返回值有个callAlloc,继续点进去会进去callAlloc方法,接下来会走:


三、最终实现
此时的obj这个返回值已经是我们需要的实例对象了,它是通过class_createInstance方法来实现,class_createInstance最终会调用initIsa来创建实例对象并返回;

最终alloc的作用是通过类来创建实例对象。
网友评论