Runtime

作者: 九月oc | 来源:发表于2020-11-16 10:35 被阅读0次

一、Runtime是什么

Runtime是苹果给我们提供的一套框架,尽可能的把一些操作从编译时推迟到了运行时。

runtime提供给我们一系列api可以让我们在程序的编译时期对代码进行一系列的操作。

首先我们要理解一些Runtime的基本概念:

1.类对象

2.元类

3.实例对象

4.类别

5.类缓存

6.method

上面这些概念都被Runtime封装成了不同的结构体,我们可以查看到结构体中的不同属性来了解这些概念。

二、Runtime的消息转发机制

在我们的项目中平时调用Runtime的时候其实就是给对象发送一条消息,让对象去找到自己的实例并且在实例的方法List中找到对应的Method 从而去找到对应的IMP地址 来调用这个函数。

在Object-C中给空指针发送消息是没有问题的,

给一个实例发送消息的时候的大概步骤如下。

先在当前的实例的cacheList 和 MethidList中查找对应的方法 , 如果没有就会通过isa指针找到父类的Methodlist进行对应的查找。 如果找不到那么Runtime框架提供了一套消息转发机制。

我们有三次机会来执行消息转发机制 如果最后消息转发没有成功那么这条消息就会被抛弃并且报错

第一次 +resolveInstanceMethod 方法

在这个方法中我们可以利用 class_addMethod方法动态的给相对应的类添加对应的方法,然后return YES 重启消息转发机制来执行我们添加之后的方法

第二次-(id)forwardingTargetForSelector方法

如果ruturnNO 则会进入下一步 执行-(id)forwardingTargetForSelector方法来找到一个备用接受者,通过SEL的比较来判断当前的方法从而进行消息对象的转发Proxy就是根据这个原理来的。

-methodSignatureForSelector

如果这两步我们都没有找到对应的方法进行转发那么系统会进行第三次消息转发执行methodSignatureForSelector方法 如果签名失败则会发出 doesNotRecognizeSelector消息 。如果返回了一个函数签名 那么就会创建一个NSInvocation对象 并且发送forwardInvocation消息给目标对象

如上就是Runtime的一些基本概念和Runtime框架自带的一些消息转发机制,在实际的开发中我们可以通过不同阶段的消息转发来防止程序崩溃或者进行我们自己想做的转发。

runtime Associate关联的对象会在NSObject_dispose方法中被销毁 但是销毁的周期会晚一些。

相关文章

网友评论

      本文标题:Runtime

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