runtime是一套可以进行一些非常底层的用OC无法实现的操作的纯C语言的API。
Objective-C 类由一个指向 objc_class 结构体的指针来表示
1 | // An opaque type that represents an Objective-C class. |
objc/runtime.h 中 objc_class 结构体的定义如下:
1 | struct objc_class { |
一个类的实例由结构体 objc_object 来表示
1 | // Represents an instance of a class. |
当我们向一个 Objective-C 对象发送消息时,运行时库会根据实例对象的 isa 指针找到这个实例对象所属的类。Runtime 库会在类或其父类的方法列表中查询并执行与消息对应的 selector 指向的方法。
元类(MetaClass)是一个类对象的类
所有的类自身也是一个对象,我们可以向这个对象发送消息 —— 调用类方法。
meta-class 也是一个类,也可以向它发送一个消息。Objective-C 的设计者让所有的 meta-class 的 isa 指向基类的 meta-class,以此作为它们的所属类。即,任何 NSObject 继承体系下的 meta-class 都使用 NSObject 的 meta-class 作为自己的所属类,而基类的 meta-class 的 isa 指针是指向它自己。这样就形成了一个完美的闭环。
1 | UIView *testView = [[UIView alloc] init]; |
控制台输出:
1 | 0x7fa410c1f990 |
runtime 对类和对象的操作
runtime 提供了大量的函数来操作类与对象。类的操作方法大部分是以 class_ 为前缀的,而对象的操作方法大部分是以 objc_ 或 object_ 为前缀。
对类操作
runtime 提供的操作类的方法主要是针对结构体 objc_class 中的各个字段的。
1 | // Returns the name of a class. |