不同的 Mac 版别对应的可调试 Runtime 版别或许会不一样,这会导致你从网上下载别人编译调试好的 Runtime 源码在你的电脑上却无法正常调试。

所以,我收集并整理了一些不同版别已经编译调试的 Runtime 源码。

你要做的,便是对照下面的表格,找到你的电脑系统对应的 Runtime 版别,然后下载即可。

macOS Runtime 版别
14.0 ~ 14.1 objc4-906
13.0 ~ 13.5 objc4-866.9
12.3 ~< 13.0 objc4-841.13

~ 表明左右都包含。例如 13.0 ~ 13.5 表明 13.0 至 13.1 而且包含 13.0 和 13.1。

~< 表明仅包含左面的版别。例如 12.3 ~< 13.0 表明 12.3 至 13.0 而且包含 12.3 但不包含 13.0。

补充:

  1. Mac 版别号一般包含三段数字,例如 14.1.1;不必管第3个数字,只需要关怀前2个数字,也便是说 14.1.1 正常情况下能够运用 14.1 对应的 Runtime 版别。

  2. 有时候系统版别与我列出的版别号稍微有点差异也没关系。例如我写的是 objc4-866.9 能在 13.0 ~ 13.5 上运转,但我实践测验发现,在 13.6.1 上也能运转。

由于时刻和精力原因,我不或许整理出一切的 Runtime 版别,如果没有你需要的那个版别,请创立一个 Issues,我会尽快处理。

或许,你也能够参考这篇文章自行编译调试:编译 objc4-866.9 源码,编译好后欢迎 Pull requests,这能够帮助到更多的人。

怎么下载

现在我运用分支来办理不同的 Runtime 版别,分支名便是 Runtime 的版别名,这种方式能够节约你的流量并加速你的下载速度,你能够只下载你需要的那个版别而不是把一切版别都下载下来。

假定你要下载 objc4-866.9 这个版别的 Runtime,你需要这样做:

git clone --branch objc4-866.9 https://gitee.com/internetWei/ObjCRuntimes.git --depth=1

--branch objc4-866.9 用于指定你要下载的分支名;

--depth=1 表明你只需要下载这个分支的最后一次提交,留意,加了这个参数后 Git 就不会下载其它分支到本地了。

实践运用指令时,你只需要把 objc4-866.9 替换为你要下载的 Runtime 版别名就行了。

留意:如果你运用上面的指令下载了最后的一次提交的代码,这些代码或许会包含我写的一些注释,我只会往项目中增加注释,不会删去或调整项目中的原有代码,包含原来的注释;

这不会影响到你的正常调试,但如果你实在不想要这些注释的话;你需要下载该分支的初次提交,分支的初次提交能够经过标签获取,例如标签「v_objc4-866.9」记录的便是分支 objc4-866.9 的初次提交;或许你也能够经过观察注释信息得知哪次提交是初次提交,初次提交的 Git 提交信息是一个固定模板:编译调试 XXX 项目。

项目中我写的注释都会在注释后边增加一个标识符「:」以便区分,比方单行注释本来是 // ...,我写的注释会是这样(留意//后边的:)://: ...;多行注释本来是 /* ... */,我的是这样:/*: ... */

运用办法

  1. 把代码下载到本地后,找到 objc.xcodeproj 并双击翻开。

  2. 挑选 Debug 这个 Scheme。

    可直接编译调试的 ObjC Runtime 源码

  3. 翻开 Debug 文件夹下的 main.m 文件。

    可直接编译调试的 ObjC Runtime 源码

  4. 这儿包含一个示例类 Person 以及一些示例代码,请在 + (void)load 办法内打上断点,然后运转该项目。

之所以在 main 中创立 Person 而不是单独创立 Person 文件,完全是无法之举;由于如果创立了 Person 文件,就会导致 main.m 中的断点失效;

或许你知道能够经过调整 main.m 文件的编译次序在 Person 文件的前面,这样 main.m 文件的确能正常调试断点了,但 Person 文件中的断点又失效了。

现在我并没有找到更好的解决方案,也不清楚导致这个问题的详细原因;如果你知道详细原因或有更好的解决方案,请联系我的邮箱告知:internetwei@foxmail.com

  1. 观察函数调用栈,如果能看到如下调用次序(不同版别的函数称号或许不一样),则OK,反之,请创立一个 Issues
0 +[Person load]
1 call_class_loads()
2 call_load_methods
3 load_images

可直接编译调试的 ObjC Runtime 源码

项目地址