如何在OC中进行源码分析

Part01-获取objc-runtime的源码

objc-runtime的源码地址

注意:⚠️⚠️⚠️,objc-runtime的源码的新旧程度并不是按照时间进行排序,而是按照包的大小进行的排序,一般可以理解为包最大的即为最新的源码

但是官网的runtime代码是无法直接运行的,如果想直接运行可以下载RetVal处理过的源代码

Part02-将OC代码编译成C++代码

  1. 找到需要编译成C++代码的OC文件,这里我们拿main.m来举例

  1. 进入到main.m所在的文件夹,执行:
1
2
3
4
5
6
7
//-fobjc-arc表示编译需要支持ARC特性。
//-framework Foundation表示引用Foundation框架,这个框架中定义了很多基本的类,例如字符串、数组、字典等等。
//后面的 mian.m 就是待编译的源代码文件名。
//-o main 表示输出的可执行文件的文件名是 main。

clang -fobjc-arc -framework Foundation main.m -o main

得到执行文件,双击可以看到执行结果

  1. 生成main.m的cpp文件main.cpp,main.cpp就是编译器对main.m进行转换的结果,执行:
    1
    clang -rewrite-objc main.m
    如果在执行执行 clang -rewrite-objc main.m是报错的,例如:
1
2
3
4
main.m:9:9: fatal error: 'UIKit/UIKit.h' file not found
#import <UIKit/UIKit.h>
^~~~~~~~~~~~~~~
1 error generated.

执行

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中的源代码