简介
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的定义

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

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


如图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
methodLists 类中所有的方法的列表,类中所有方法的列表,使用场景:如在程序中写好方法,通过外部获取到方法名称字符串,然后通过这个字符串得到方法,从而达到外部控制App已知方法。
cache 主要用于缓存常用方法列表,每个类中有很多方法,我平时不用的方法也会在里面,每次运行一个方法,都要去methodLists遍历得到方法,如果类的方法不多还行,但是基本的类中都会有很多方法,这样势必会影响程序的运行效率,所以cache在这里就会被用上,当我们使用这个类的方法时先判断cache是否为空,为空从methodLists找到调用,并保存到cache,不为空先从cache中找方法,如果找不到在去methodLists,这样提高了程序方法的运行效率
protocols 故名思义,这个类中都遵守了哪些协议,使用场景:判断类是否遵守了某个协议上
网友评论