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之外,还有别的源码分析、架构设计等,很多精品
发表回复