这篇文章与上一片文章区别在于,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