1. Runtime是什么
runtime 又叫运行时,它是一套底层的 C 语言 API, 其为 iOS 内部的核心之一,我们平时写的 OC 代码,底层都是基于它来实现。
比如
[receiver message];
底层运行时会被编译器转译为
objc_msgSend(receiver, selector)
如果有参数
[receiver message:(id)arg];
objc_msgSend(receiver, selector, arg1, arg2, ...)
2.为什么需要Runtime
- Objective-C 是一门动态语言,它会将一些工作放在代码运行时才处理而并非编译时。也就是说,有很多类和成员变量在我们编译的时是不知道的,而在运行时,我们所编写的代码会转换成完整的确定的代码运行。
- 因此,编译器是不够的,我们还需要一个运行时系统(Runtime system)来处理编译后的代码。
- Runtime 基本是用 C 和汇编写的,由此可见苹果为了动态系统的高效而做出的努力。苹果和 GNU 各自维护一个开源的 Runtime 版本,这两个版本之间都在努力保持一致。
3.Runtime 的作用
OC 在三种层面上与 runtime 系统进行交互
-
通过 Objective-C 源码
只要编写 OC 代码,Runtime 系统就会自动在幕后搞定一切,调用方法,编译器会将 OC 代码转换成运行时代码,在运行时确定数据结构和函数。 -
通过 Foundation 框架的 NSObject 类定义的方法
一些 NSObject 方法可以从 runtime 系统获取信息,允许对象进行自我检查,
比如:
- (void)class; //返回对象的类
- (BOOL)isKindOfClass // 是否是其子类或者父类
- (BOOL)isMemberOfClass //是否当前类的成员变量
- (BOOL)responseToSelector:(id)SEL //检查对象能否响应指定的消息
- 通过对 rumtime 库函数的直接调用
objc/Runtime.h
网友评论