问题1: 什么是Runtime
runtime
是由C
、C++
汇编
实现的一套API
,为OC语言
加入了面向对象
,运行时
的功能。是一种运行机制。平时编写的OC代码,在程序运行过程中,其实最终会转换成Runtime的C语言代码,Runtime 是 Objective-C 的幕后工作者。
问题2: 方法的本质是什么?
- 方法的本质:
发送消息 objc_msgSend
- 关键方法:
lookUpImpOrForward
消息会有以下几个流程
- 快速消息查找, 从 cache_t 缓存查找目标函数。
- 慢速消息查找
lookUpImpOrForward
递归 自身链, 找不到去父类缓存中找,依然找不到会 递归父类链继续查找 - 查找不到消息进行动态方法解析 resolveInstanceMethod / resolveClassMethod . resolveClassMethod 的过程中如果没有找到方法,会调用 resolveInstanceMethod
- 消息快速转发 forwardingTargetForSelector, 相当于找消息备用接收者
- 消息慢速转发 methodSignatureForSelector & forwardInvocation, 在仍然没有解决问题后在methodSignatureForSelecto r的时候会再进行一次慢速消息查找(这次不进行消息转发)
- 都找不到报如下错, 并crash
unrecognized selector sent to instance XXX
SEL & IMP是什么? 以及两者之间的关系?
SEL
: 是方法编号
, 在read_images
期间就编译进入了内存
IMP
: 是函数实现指针 ,
找 imp 就是找函数的过程 sel 就相当于书本的目录 tittle
imp 就是书本的⻚码 查找具体的函数就是想看这本书里面具体篇章的内容
- 我们首先知道想看哪一个tittle (sel)
- 根据目录对应的⻚码 (imp)
- 翻到具体的内容