runtime概念:
Objective-C是基于C的,为C添加了面向对象的特性。将很多静态语言在编译和链接时期做的事情放到了runtime运行时来处理,可以说runtime是Objective-C幕后工作者
runtime(简称运行时),是一套纯C(C和汇编写的)的API。而OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制。
C语言中,函数的调用在编译的时候回决定调用哪个函数。
OC语言中,函数调用称为消息发送,属于动态调用过程。在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。
事实证明:在编译阶段,OC可以调用任何函数,即使这个函数并未实现,只要声明过就不会报错,只有当运行的时候才会报错,这是因为OC是运行时动态调用的。而C语言调用未实现的函数就会报错。
runtime消息机制
原理:对象根据方法编号SEL去映射表查找对应的方法实现。
消息机制方法调用流程
- OC在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象对应的类或其父类中查找方法
- 注册方法编号(这里用方法编号的好处,可以快速查找)
- 根据方法编号去查找对应方法
- 找到最终函数实现地址,根据地址去方法区调用对应函数
每个对象内部都有一个isa指针,这个指针是指向它的真实类型,根据这个指针就能知道调用的是哪个类的方法
runtime常见作用
- 动态交换两个方法的实现
- 动态添加属性
- 实现字典转模型的自动转换
- 动态添加方法
- 拦截并替换方法
网友评论