main函数中调用alloc和init方法
CZPerson *p1 = [CZPerson alloc];
CZPerson *p2 = [p1 init];
CZPerson *p3 = [p1 init];
NSLog(@"%@-%p-%p",p1,p1,&p1);
NSLog(@"%@-%p-%p",p2,p2,&p2);
NSLog(@"%@-%p-%p",p3,p3,&p3);
仔细分析得到
- 1 alloc为对象开辟了内存,init未改变内存地址
- 2 init改变了指针地址
- 3 对象初始大小为16字节
init似乎没敢啥事,那么剩下的我们直接分析alloc具体做了些什么呢?
下面我们一起来探究...
汇编调试
1.alloc方法行打上断点运行 2.打开汇编 选择debug-->debugworkflow-->always show disassembly
显示如图
调用了objc.A.dylib库里的底层方法objc_alloc既alloc
进入objc.A.dylib库对objc_alloc进行调试发现调用了_objc_rootAllocWithZone
继续对_objc_rootAllocWithZone进行调试发现调用函数calloc
通过汇编调试得到初步的alloc流程
graph TD
objc_alloc --> _objc_rootAllocWithZone --> calloc --> ...
待完善...
但这些方法似乎与底层方法有些出入,我们下面用底层源码来验证当前流程是否正确
源码调试
基于objc4源码进行调试 源码直通车
根据前面的汇编调试得到alloc首先调用的底层方法是objc_alloc,在源码工程进行全局搜索快速定位到下面这些alloc相关的底层方法,然后在所有相关方法打上断点来查看调用顺序,这样便可以轻松得到alloc的调用流程。
顺序如图:
整理得到alloc流程图如下
graph TD
alloc.or.objc_alloc --> _objc_rootAlloc --> callAlloc --> ...
待完善...