美文网首页
Runtime之初探

Runtime之初探

作者: JunkieBa | 来源:发表于2019-08-03 18:19 被阅读0次

简介


Runtime官方文档

The Objective-C language defers as many decisions as it can from compile time and link time to runtime. Whenever possible, it does things dynamically. This means that the language requires not just a compiler, but also a runtime system to execute the compiled code. The runtime system acts as a kind of operating system for the Objective-C language; it’s what makes the language work.

OC是一门动态语言,会将一些程序的一些决定工作从编译期推迟到运行期。它会在任何可能的时机动态处理事情。这就意味着这门语言不仅需要编译器,同时还需要运行时系统来执行编译后的代码。运行时系统就好像是Obiective-C的操作系统一样,让这门语言可以运行。

Runtime有Legacy和Modern两个版本,其中Legacy用于Objective-C 1.0 、32位的Mac OS X平台,Modern用于iPhone程序和Mac OS X v10.5及以后的系统中的64位程序

Objective-C有有三种途径和运行时系统进行交互:

通过Objective-C源代码

通过Foundation框架中的NSObject的方法

通过调用运行时系统给我们提供的API接口

Runtime的作用


Runtime的基本作用

在程序运行期间,动态创建类,动态添加、修改这个类的方法和属性。

遍历一个类中所有的变量、属性及方法。

消息传递、消息转发。

Runtime典型应用场景

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

方法交换

获取对象的属性、私有属性

字典转换模型

KVC、KVO 、Block

归档(编码、解码)

NSClassFromString class<->字符串

类的自我检测

method swizzing (Aspects 基于method swizzing)

...

Runtime的定义


Runtime开源代码

图a

图a所示Objective-C类是由Class类型来表示的,其实际是指向objc_class结构体的指针。objc_class结构体如图b所示

图b

图b可知Class是类、id是指向objc_object 的一个指针,而objc_object有个isa指向objc_class的一个指针。不管id,还是Class最终指向的都是objc_class这个结构体。

objc_class结构体如图c所示

图c


图d

如图d所示

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

  • 类的实例对象的 isa 指向该类;该类的 isa 指向该类的 MetaClass
  • MetaCalss的isa对象指向RootMetaCalss
  • 如果MetaClass是RootMetaCalss,那么该MetaClass的isa指针指向它自己

super_class Class对象指向父类对象

  • 如果该类的对象已经是RootClass,那么这个super_class指向nil
  • MetaCalss的SuperClass指向父类的MetaCalss
  • MetaCalss是RootMetaCalss,那么该MetaClass的SuperClass指向该对象的RootClass
ivars 类中所有属性的列表,使用场景:我们在字典转换成模型的时候需要用到这个列表找到属性的名称,去取字典中的值,KVC赋值,或者直接Runtime赋值

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

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

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

相关文章

  • runtime底层实现原理

    一、Runtime介绍二、Runtime源码初探三、Runtime消息传递四、Runtime消息转发五、Runti...

  • Runtime-原理

    runtime初探对象与方法的本质runtime-消息发送runtime-动态方法解析runtime-消息转发 r...

  • 2020-02-23 Runtime

    目录: 01-Runtime 初探 02-Runtime 对象与方法的本质 03-Runtime 动态方法解析 0...

  • runtime 框架整理

    runtime初探 runtime C C++ 汇编写成的APIOC 运行时 legacy Version 早期版...

  • Runtime的执行过程(一)

    接着上一篇Runtime初探,我们来探究一下Runtime的工作原理。 1、runtime的交互 苹果告诉我们有3...

  • RunTime初探

      很早就遇到了runtime, 由于我在实际开发中使用较少,所以也一直没有去研究或者说没有去正视这一块,可能也...

  • Runtime初探

    一、runtime简介 RunTime简称运行时。OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消...

  • 初探Runtime

    用过OC都应该或多或少知道runtime这个黑魔法。OC强大的原因就是运行时这个特性,虽然实际开发中需要用到的ru...

  • Runtime初探

    关于runtime简单来说就是运行时,是系统运行的一些机制,其中最主要的是消息机制。 example: OC里面调...

  • iOS runtime(三)runtime之method(1)m

    iOS runtime(一)runtime之Property 详尽iOS runtime(二)runtime之Iv...

网友评论

      本文标题:Runtime之初探

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