Runtime之初探

简介


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开源代码

Runtime之初探_第1张图片
图a

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

Runtime之初探_第2张图片
图b

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

objc_class结构体如图c所示


Runtime之初探_第3张图片
图c


Runtime之初探_第4张图片
图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之初探)