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

不同的 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 复制代码
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。

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

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

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

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

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

  1. 观察函数调用栈,如果能看到如下调用顺序(不同版本的函数名称可能不一样),则OK,反之,请创建一个 Issues
objc 复制代码
0 +[Person load]
1 call_class_loads()
2 call_load_methods
3 load_images

项目地址

相关推荐
与火星的孩子对话6 小时前
Unity进阶课程【六】Android、ios、Pad 终端设备打包局域网IP调试、USB调试、性能检测、控制台打印日志等、C#
android·unity·ios·c#·ip
恋猫de小郭1 天前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
点金石游戏出海1 天前
每周资讯 | Krafton斥资750亿日元收购日本动画公司ADK;《崩坏:星穹铁道》新版本首日登顶iOS畅销榜
游戏·ios·业界资讯·apple·崩坏星穹铁道
旷世奇才李先生2 天前
Swift 安装使用教程
开发语言·ios·swift
90后的晨仔2 天前
Xcode16报错: SDK does not contain 'libarclite' at the path '/Applicati
ios
finger244802 天前
谈一谈iOS线程管理
ios·objective-c
Digitally2 天前
如何将大型视频文件从 iPhone 传输到 PC
ios·iphone
梅名智2 天前
IOS 蓝牙连接
macos·ios·cocoa
美狐美颜sdk2 天前
跨平台直播美颜SDK集成实录:Android/iOS如何适配贴纸功能
android·人工智能·ios·架构·音视频·美颜sdk·第三方美颜sdk
恋猫de小郭2 天前
Meta 宣布加入 Kotlin 基金会,将为 Kotlin 和 Android 生态提供全新支持
android·开发语言·ios·kotlin