iOS知识复习笔记(7)---RunTime运行机制

简介

RunTime 又叫运行时,是一套底层C、C++、汇编语言API,其为iOS内部的核心之一,我们平时编写的OC代码,底层都是基于它来实现的。

运行时将数据类型的确定由编译时推迟到了运行时。并且oc代码最终也是会转为runtime的c语言代码

方法的本质是什么

方法的本质其实就是发送消息(objc_msgSend),即寻找IMP的过程。

消息发送会有以下几个流程:

  1. 快速查找流程,通过objc_msgSend查找缓存cache_t是否有imp实现。

  2. 慢速查找流程,通过lookUpImpOrForward 递归查找当前类以及父类的rw中methodlist里是否包含该方法。

  3. 如果以上两步都没找到则进入消息转发阶段:

    1.动态方法解析,通过调用resolveInstanceMethod和resolveClassMethod来动态方法决议,实现消息的动态处理

    2.快速转发流程,通过forwardingTargetForSelector实现快速转发,由其他对象来实现处理方法。

    3.慢速转发流程,先调用methodSignatureForSelector获取的方法签名,生成对应的invocation,再通过forwardInvocation来进行处理。

  4. 以上都没处理成功则执行doesNotRecognizeSelector,会崩溃报unrecognized selector 错。

转发流程图如下:
消息转发流程.png

消息传递过程中的概念

instance 实例、class 类、meta class 元类 ,三者关系图如下:

实例类和元类关系.png

class 类内部结构如下图:
class 类结构.png

其中 class_rw_t 包含 class_ro_t, 分类方法,分类属性,分类协议

其中class_ro_t 包含类名,类方法列表,类实例变量,类属性,类协议。

项目中应用

  1. 动态重写方法

  2. 方法交换

  3. 解档归档

  4. 字典转模型

  5. 页面统计

  6. 防止按钮多次点击事件

  7. 防止数组越界

  8. 防止找不到方法崩溃

  9. 全局修改控件样式

等等。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容