runtime 在程序开发中的定位:
在计算机领域中,代码从编写到执行得出结果,中间会有编译、链接、运行等过程,这样我们的代码才可以转换成计算机所识别的指令等,然后达成我们期望的效果。而runtime
就是处于运行的这个阶段。基本上每个平台都有自己的runtime,比如Android
等。
引用网上看到的一个说法,不知道是否准确,可以做个参考
“runtime 是一个通用的抽象的术语,指的是计算机程序运行的时候所需要的一切代码库,框架,平台等。”
Apple 中对runtime的描述
将尽可能多的决策从编译时和链接时推迟到运行时(Apple)
运行时系统充当着Object-C语言的操作系统,它使语言能够工作(Apple)
Objective-C 中runtime所起的作用
1、Objective-C程序在三个不同的层次上与运行时系统交互:
- 通过Object-C源代码进行交互
- 通过NSObject类中定义的方法交互
- 通过直接调用运行时函数
2、runtime 在开发中有什么作用
- 在程序运行过程中,动态地添加类,修改类的属性和方法
- 遍历类中的所有属性和方法
- 消息机制:消息传递、转发
3、runtime 的典型使用案例
- 给分类添加属性和方法实现
- 字典转模型
- KVC、KVO
- 归档(编码、解码)
- 方法交换
- 根据类名创建类,根据方法名找到方法实现
…
参考代码:
调用 runtime
的c语言代码需要添加的头文件
#import <objc/runtime.h>
#import <objc/message.h>
objc_class
结构体定义:
struct objc_class {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class _Nullable super_class OBJC2_UNAVAILABLE;
const char * _Nonnull name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list * _Nullable ivars OBJC2_UNAVAILABLE;
struct objc_method_list * _Nullable * _Nullable methodLists OBJC2_UNAVAILABLE;
struct objc_cache * _Nonnull cache OBJC2_UNAVAILABLE;
struct objc_protocol_list * _Nullable protocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */
消息转发过程会调用的方法:
1、动态方法解析
+ (BOOL)resolveInstanceMethod:(SEL)sel 实例方法解析
+ (BOOL)resolveClassMethod:(SEL)sel 类方法解析
2、后备接受者对象
- (id)forwardingTargetForSelector:(SEL)aSelector
3、以其他形式实现该消息方法
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
- (void)forwardInvocation:(NSInvocation *)anInvocation
4、最后未处理,抛出异常
- (void)doesNotRecognizeSelector:(SEL)aSelector
参考网站:深入浅出Runtime