简介
RunTime 又叫运行时,是一套底层C、C++、汇编语言API,其为iOS内部的核心之一,我们平时编写的OC代码,底层都是基于它来实现的。
运行时将数据类型的确定由编译时推迟到了运行时。并且oc代码最终也是会转为runtime的c语言代码
方法的本质是什么
方法的本质其实就是发送消息(objc_msgSend),即寻找IMP的过程。
消息发送会有以下几个流程:
-
快速查找流程,通过objc_msgSend查找缓存cache_t是否有imp实现。
-
慢速查找流程,通过lookUpImpOrForward 递归查找当前类以及父类的rw中methodlist里是否包含该方法。
-
如果以上两步都没找到则进入消息转发阶段:
1.动态方法解析,通过调用resolveInstanceMethod和resolveClassMethod来动态方法决议,实现消息的动态处理
2.快速转发流程,通过forwardingTargetForSelector实现快速转发,由其他对象来实现处理方法。
3.慢速转发流程,先调用methodSignatureForSelector获取的方法签名,生成对应的invocation,再通过forwardInvocation来进行处理。
-
以上都没处理成功则执行doesNotRecognizeSelector,会崩溃报unrecognized selector 错。
消息传递过程中的概念
instance 实例、class 类、meta class 元类 ,三者关系图如下:
实例类和元类关系.png class 类内部结构如下图: class 类结构.png其中 class_rw_t 包含 class_ro_t, 分类方法,分类属性,分类协议
其中class_ro_t 包含类名,类方法列表,类实例变量,类属性,类协议。
项目中应用
-
动态重写方法
-
方法交换
-
解档归档
-
字典转模型
-
页面统计
-
防止按钮多次点击事件
-
防止数组越界
-
防止找不到方法崩溃
-
全局修改控件样式
等等。
网友评论