1、基于断点的底层探索(
)
定义一个Person类:
person类
:点击进入alloc方法的定义,找到
+ (instancetype)alloc OBJC_SWIFT_UNAVAILABLE("use object initializers instead");
之后无法进一步追溯。
:符号断点alloc方法,汇编代码分析。
注:app启动预先会调用很多alloc方法,最好在Person类的alloc之前都disable符号断点,得到如下:
_objc_rootAlloc方法

跳转_objc_rootAllocWithZone,所属libobjc.A.dylib

calloc方法,所属 libsystem_malloc.dylib

malloc_zone_calloc方法,所属libsystem_malloc.dylib
得到malloc_zone_calloc方法,如果继续用符号断点进行跟进会发现没有明显的alloc的标示,无法进一步分析,这时候就需要源码分析了。
2、objc4源码环境配置
源码路径地址:https://opensource.apple.com/ 下载地址:https://opensource.apple.com/tarballs
可以在iOS最新版本中web界面搜索objc找到如下:(这里为什么搜索objc,主要之前是基于libobjc.A.dylib,同样也可以搜索malloc,基于libsystem_malloc.dylib)

objc4-781源码

库和引用

main方法
然后运行,会发现报错 找不到头文件,这里参考了Style_月月同学文章 https://www.jianshu.com/p/2fae148f015f,添加相应的缺失文件。这里我补充一下我遇到的两个个文件补充完后仍存在的文章未提到的问题:
1、文件方法中存在一个
方法,宏定义报错。
uint32_topts = OS_UNFAIR_LOCK_DATA_SYNCHRONIZATION | OS_UNFAIR_LOCK_ADAPTIVE_SPIN;
由于没有这个定义所以报错,这里将后面这个选项删除。
2、文件中,
方法报错。
在 添加
,debug和release都加入。
这样就可以继续调试了
