美文网首页
oc 中的runtime(一)

oc 中的runtime(一)

作者: 星空WU | 来源:发表于2021-02-03 15:16 被阅读0次

 runtime 概念

    runtime 简称运行时,

     1)一套纯C语言的API.OC具有运行时机制;

     2)将尽可能多的决策从编译时和链接时推迟到运行时(Apple官方解 释);

     3)运行时系统充当着Object-C语言的操作系统,它使语言能够工作 (Apple官方解释

   特性:其编写的代码具有运行时、动态特性。

runtime用来干什么?用在哪些地方?

    Objective-C程序在三个不同的层次上与运行时系统交互:

            1) 通过Object-C源代码进行交互;

            2) 通过NSObject类中定义的方法交互;

            3) 通过直接调用运行时函数;

    用来干什么 基本作用

            1) 在程序运行过程中,动态的创建类,动态添加、修改这个类的     

                属性和方法;

            2) 遍历一个类中所有的成员变量、属性、以及所有方法;

            3) 消息传递、转发;

    用在哪些地方 Runtime的典型事例

            1) 给系统分类添加属性、方法;

            2) 方法交换;

            3) 获取对象的属性、私有属性;

            4) 字典转换模型;

            5) KVC、KVO;

            6) 归档(编码、解码);

            7) NSClassFromString class<->字符串;

            8) block;

            9) 类的自我检测

            10)    .....

 runtime 定义

        oc中的NSObject 对象中

    上述中的isa指针是一个Class类型,他实质是一个指向objc_class的结构体指针。

    可以使用clang命令查看编译的cpp文件,关于clang使用可以看我的浅拷贝深拷贝文章。

    可以看到,id是指向一个objc_object 结构体的指针,而objc_object有一个isa指针指向objc_class;所以id和Class都是指向一个objc_class类型的结构体。

    objc_class结构体结构如下:

在runtime使用当中,我们经常需要用到的字段:

isa Class对象,指向objc_class结构体的指针,也就是这个Class的MetaClass(元类)

    1)类的实例对象的 isa 指向该类;该类的 isa 指向该类的 MetaClass

    2)MetaCalss的isa对象指向RootMetaCalss

super_class Class对象指向父类对象

    1)如果该类的对象已经是RootClass,那么这个super_class指向nil

    2)MetaCalss的SuperClass指向父类的MetaCalss

    3)MetaCalss是RootMetaCalss,那么该MetaClass的SuperClass指向该对象的RootClass

ivars: 类中所有属性的列表,使用场景:我们在字典转换成模型的时候需要用到这个列表找到属性的名称,去取字典中的值,KVC赋值,或者直接Runtime赋值

methodLists :类中所有的方法的列表,类中所有方法的列表,使用场景:如在程序中写好方法,通过外部获取到方法名称字符串,然后通过这个字符串得到方法,从而达到外部控制App已知方法。

cache:主要用于缓存常用方法列表,每个类中有很多方法,我平时不用的方法也会在里面,每次运行一个方法,都要去methodLists遍历得到方法,如果类的方法不多还行,但是基本的类中都会有很多方法,这样势必会影响程序的运行效率,所以cache在这里就会被用上,当我们使用这个类的方法时先判断cache是否为空,为空从methodLists找到调用,并保存到cache,不为空先从cache中找方法,如果找不到在去methodLists,这样提高了程序方法的运行效率。

protocols: 这个类中都遵守了哪些协议,使用场景:判断类是否遵守了某个协议上.

类底层代码、类的本质?

将Game文件编译为.cpp文件

    上述是Object-C中类中基本的数据,了解了类的定义,我们基本可以这么理解,类就是多个结构体组合的一个集合体,类中的行为、习惯、属性抽象,按照机器能懂的数据存储到我们底层的结构体当中,在我们需要使用的时候直接获取使用。

    类底层是如何调用方法?

.cpp文件

    1)objc_msgSend :消息发送

    2)objc_getClass: 获取对象

    3) sel_registerName 获取方法的SEL

一个对象调用其方法,在Object-C中就是向这个对象发送一条消息,消息的格式

Rumtime是Objective-C语言动态的核心,Objective-C的对象一般都是基于Runtime的类结构,达到很多在编译时确定方法推迟到了运行时,从而达到动态修改、确定、交换...属性及方法

感谢作者:https://www.jianshu.com/p/291754a90d2b

相关文章

网友评论

      本文标题:oc 中的runtime(一)

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