共计 791 个字符,预计需要花费 2 分钟才能阅读完成。
runtime 概览
Objective- C 这个语言,基本思路是把上层语法特性在编译器里都翻译成 c 层面的调用,调用的目标,就是 runtime 库了。
最早的时候我曾经有个傻傻的想法,是不是每个 Objc 程序都打包了一份 runtime 进去 … 真实的实现当然不会这么蠢啦,系统里会有个叫 libobjc.A.dylib
的动态库,每个 Objc 程序都会去调用它。
如何学习 runtime
前面我们提到 Objc 实际上是转译为 C 再加上 runtime。因此这里一方面是关注 runtime 本身的实现,另一方面也要关注其转译的过程。
1. runtime 源码
runtime 源码。官方源码,这里有历代版本的,比较全。github 上的 objc4,也是官方的,不过看起来比苹果自家网站发布的要旧一些,不过区别不大。
直接编译会缺少各种依赖,可以在 github 找别人已经处理好的代码直接运行。
2. clang 的转译
前面有提到,Objc 是把上层语法编译成 c 语法的,因此这个转译的过程也非常关键。
clang 提供了这种显式转译的能力:clang -rewrite-objc main.m
通过这条指令可以把 Objc 代码转为 C 代码,便于分析底层实现。
另外需要注意的是,这种转译的能力跟实际的编译可能并没有保证完全一致,但作为参考是足够了。
参考资料
官方资料和其它博客文章等。
官方的找到两份:
Objective-C Runtime:官方 API 文档
Objective-C Runtime Programming Guide:官方教程
个人在学习过程中看到的比较好的资料:
objc 的 Runtime:相对宏观的了解
知乎讨论该如何阅读 Objective-C runtime 源码?
objc 源码解析 -ObjectiveC 对象结构对 Class,Object 的底层结构这块讲得很清晰。
analyze 系列,除了 objc 的 runtime 之外,还有别的源码分析、架构设计等,很多精品