美文网首页
runtime探索

runtime探索

作者: 爱玩基金的程序员 | 来源:发表于2020-03-18 14:47 被阅读0次

# 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动态的添加方法实现

相关文章

网友评论

      本文标题:runtime探索

      本文链接:https://www.haomeiwen.com/subject/szqjkxtx.html