ObjC 之 Runtime 是个啥
Table of Contents
概述 #
Runtime 是 OC 这个语言的核心,也是为什么 OC 被称为动态语言的原因。
当我们在讲 Runtime
的时候,我们在说什么?
根据官方文档的定义,
Objective-C Runtime Programming Guide
Runtime 是一个动态库 (/usr/lib/libobjc.A.dylib),用于实现 OC 语言的动态性。
这个动态性主要体现在三个方面 ref:
- 动态类型 (Dynamic Typing): 运行时才能决定对象的类型,也就是说编译器不检查类型合法性
- 动态绑定 (Dynamic Binding): 运行时才能知道方法被如何执行,也就是消息机制 (messaging)
- 动态加载 (Dynamic Loading): 允许动态添加类、方法等
起源 #
孙源大佬在 博客 中说过,OC1 其实是 C 语言与 SmallTalk2 思想结合的产物。
与同属 SmallTalk 学派的语言 Java, Python 和 Ruby 一样,OC 具有面向对象、动态类型和反射式等特点。
Objective-C = C + Preprocessor + Runtime
SmallTalk 领先了时代 20 年,至今 OC 仍然没有实现它的全部特性。
Runtime Version #
存在两个版本的 Runtime,modern
和 legacy
:
developer.apple.com/ObjCRuntimeGuide/ocrtVersionsPlatforms
按照官方的说明,所有 iPhone 和 10.5 版本之后的 Mac OSX 64 位程序都使用的 OC 2.0。
Runtime 源码: https://opensource.apple.com/source/objc4/
下载 tarballs: https://opensource.apple.com/tarballs/objc4/
可调试项目: https://github.com/RetVal/objc-runtime
Runtime 里有什么 #
Runtime 的源码可以在 RetVal/objc-runtime 这里找到,甚至可以 Debug。
主要包含如下几个方面,后续会逐个总结。
Class/Object 与 isa #
MetaClass #
- 元类指向链: 实例 -> 类 -> 元类 -> 根元类 -> 根元类 (isa 指向自己)
- 类的继承链: 子类 -> 父类 -> NSObject -> nil
- 元类的继承链: 子类元类 -> 父类元类 -> 根元类 -> NSObject -> nil
参考: 从 Meta 说起
Method/IMP/SEL #
Category #
Messaging #
Swizzling #
其它常用方法 #
++++++