这篇文章与上一片文章区别在于,NSObject中的alloc与自定义类中的alloc的源码流程的区别。
NSObject的alloc无法进入源码
-
在
NSObject与Animal处添加断点
image.png -
在alloc源码处打一断点
image.png -
放开第一处断点,发现并没有进入alloc源码
image.png
探索NSObject中的alloc为什么不走alloc

image.png
通过汇编代码得知[NSObject alloc]走的是objc_alloc方法

image.png
探索[NSObject alloc]与[Animal alloc]的区别
-
NSObject为基类,所有的自定义对象都要继承自NSObject - Animal继承了
NSObject,重写了NSObject的alloc
1.经过断点调试发现Animal中的alloc调用了两次,即调用alloc源码后,还会走到objc_alloc,调用callAlloc两次

image.png
- 发现第一次
objc_alloc --> callAlloc走到callAlloc方法后调用的是endif下面的objc_msgSend方法,表示向objc_msgSend系统发送消息 - 继续执行代码后,发现执行的是
alloc --> callAlloc --> _objc_rootAllocWithZone,这是我们上一篇文章介绍的内容
2.至于NSObject中alloc 走到 objc_alloc的 原因这是系统所自动调用的。
结论:
1.[NSObject alloc]执行流程

image.png
2.自定义类的alloc执行流程

image.png


