alloc的基本流程分析
一 准备工作:
新建一个Demo工程,创建一个LGPerson类,继承NSObject,如图:
1打断点运行后,按control,点击单步调试,进入如下图:
从上图可以看出,此时调用objc_alloc函数,我们加一个objc_alloc的符号断点,进入如下图
2从上图可以看出,objc_alloc方法是在libobjc.dylib动态库中,也就是在objc的源码中,objc的源码苹果开源出来了,我们下载下来,通过一系列的配置,可以调试(源码的调试,后续文章推出,这里用已配好的objc818举例)
二 源码的分析:
我们把上述的Demo中的LGPerson放到源码工程中,并在main函数创建这个类对象。
在源码中,我们可以单步的调试,发现_objc_rootAlloc,callAlloc,_objc_rootAllocWithZone这几个关键函数,我们通过源码分析,得出alloc的基本流程:
1 alloc
2 _objc_rootAlloc
3 callAlloc
4 _objc_rootAllocWithZone
5 _class_createInstanceFromZone
5.1 instanceSize(计算大小)
5.2 calloc(分配内存)
5.3 检查内存分配是否成功
5.3.1 失败 _objc_callBadAllocHandler
5.3.2 成功 initInstanceIsa(初始化isa)
6 return
结语:
1.cls->instanceSize:先计算出需要的内存空间大小,对象内存大小由成员变量决定。
2.calloc:向系统申请开辟内存,返回地址指针
3.obj->initInstanceIsa:关联到相应的类
4.计算字节对齐
(x + WORD_MASK) & ~WORD_MASK; WORD_MASK为7UL
网友评论