# Runtime介绍
```
runtime是由c、c++、汇编组成的一套api, 称为运行时,它区别于编译。
编译时:编译时将项目中源代码翻译成机械能识别的代码的过程,主要是对语言进行最基本检查编译报错。如语法分析,词法分析等,是一个静态的阶段。
运行时:运行时是将代码跑起来,装载到内存中的过程,如果此时出现,则程序会崩溃,是一个动态阶段。
```
# Runtime消息查找
### objc_msgSend
`1.通过对象的isa指针找到结构体,在该类的结构中查找`
# Runtime消息快速查找
# Runtime动态方法解析
`1.当本类和父类cache包括calss_rw_t中找不到方法时,就会进入动态方法解析阶段。`
```js
if (resolver && !triedResolver) {
runtimeLock.unlockRead();
_class_resolveMethod(cls, sel, inst);
runtimeLock.read();
// Don't cache the result; we don't hold the lock so it may have
// changed already. Re-do the search from scratch instead.
triedResolver = YES;
goto retry;
}
```
> _class_resolveMethod函数内部,根据类对象或元类对象做不同的操作
```js
void _class_resolveMethod(Class cls, SEL sel, id inst)
{
if (! cls->isMetaClass()) {
// try [cls resolveInstanceMethod:sel]
_class_resolveInstanceMethod(cls, sel, inst);
}
else {
// try [nonMetaClass resolveClassMethod:sel]
// and [cls resolveInstanceMethod:sel]
_class_resolveClassMethod(cls, sel, inst);
if (!lookUpImpOrNil(cls, sel, inst,
NO/*initialize*/, YES/*cache*/, NO/*resolver*/))
{
_class_resolveInstanceMethod(cls, sel, inst);
}
}
}
```
> 动态解析方法之后,会将triedResolver = YES;那么下次就不会在进行动态解析阶段了,之后会重新执行retry,会重新对方法查找一遍。也就是说无论我们是否实现动态解析方法,无论动态解析方法是否成功,retry之后都不会在进行动态的解析方法了
### 动态解析方法
`动态解析对象方法时,会调用+(BOOL)resolveInstanceMethod:(SEL)sel方法`
`动态解析类方法时,会调用+(BOOL)resolveClassMethod:(SEL)sel方法`
>当本类和父类cache和class_rw_t中都找不到方法时,就会进行动态解析的方法,就是说会自动调用类的resolveInstanceMethod:方法进行动态查找。因此我们可以在resolveInstanceMethod:方法内部使用class_addMethod动态的添加方法实现
网友评论