如何在OC中进行源码分析
Part01-获取objc-runtime的源码
objc-runtime的源码地址
注意:⚠️⚠️⚠️,objc-runtime的源码的新旧程度并不是按照时间进行排序,而是按照包的大小进行的排序,一般可以理解为包最大的即为最新的源码
但是官网的runtime代码是无法直接运行的,如果想直接运行可以下载RetVal处理过的源代码
Part02-将OC代码编译成C++代码
- 找到需要编译成C++代码的OC文件,这里我们拿
main.m
来举例
- 进入到main.m所在的文件夹,执行:
1 | //-fobjc-arc表示编译需要支持ARC特性。 |
得到执行文件,双击可以看到执行结果
- 生成main.m的cpp文件main.cpp,main.cpp就是编译器对main.m进行转换的结果,执行:如果在执行
1
clang -rewrite-objc main.m
执行 clang -rewrite-objc main.m
是报错的,例如:
1 | main.m:9:9: fatal error: 'UIKit/UIKit.h' file not found |
执行
1 | clang -x objective-c -rewrite-objc -isysroot /Applications/Xcode.app/xxxxx.m |
Part03-根据C++代码,结合objc-runtime源码进行分析
执行完上面的指令,生成了相关文件的C++ 代码,C++代码用到了objc-runtime源码,所以要进入到objc-runtime源码,探索本质。例如下面是main.m编译成main.cpp文件时,-(void)eat生成的C ++代码。标出来的代码都是objc-runtime中的源代码