大多数情况下,运行时系统仅在幕后自动工作,主要用于编写和编译Objective-C源程序
笔者目前对Runtime认识不够深入,所以不敢多写,只是稍微做点笔记,更多请看:Runtime
* 学runtime,必须会 消息处理机制,就是消息的发送及消息的转发。*
下面我带大家简单了解一下:
1、什么是runtime?
答:
1> runtime是一套底层的C语言API(包含很多强大实用的C语言数据类型、C语言函数)
2> 实际上,平时我们编写的OC代码,底层都是基于runtime实现的
也就是说,平时我们编写的OC代码,最终都是转成了底层的runtime代码(C语言代码)
2、runtime有啥用?
1> 能动态产生一个类、一个成员变量、一个方法
2> 能动态修改一个类、一个成员变量、一个方法
3> 能动态删除一个类、一个成员变量、一个方法
3、实际使用(常见的函数、头文件
)Ivar:定义对象的实例变量,包括类型和名字。
-
1>导入: #import <objc/runtime.h> : 成员变量、类、方法
Ivar * class_copyIvarList : 获得某个类内部的所有成员变量
Method * class_copyMethodList : 获得某个类内部的所有方法Method class_getInstanceMethod : 获得某个实例方法(对象方法,减号-开头) Method class_getClassMethod : 获得某个类方法(加号+开头) method_exchangeImplementations : 交换2个方法的具体实现
2>导入: #import <objc/message.h> : 消息机制
objc_msgSend(....)
4、什么是iOS Swizzle?利用运行时函数交换2个方法的实现?
1、OC/C/C++的编译过程:下面先look一张图:
下面带着大家使用一个简单的例子来认识一下:
- 首先,我创建一个新工程:这里不使用IOS,为了方便,我使用的是Mac工程。工程名字为:textRuntime
- 使用终端:cd 空格 把工程拖进终端
- 然后:输入命令回车:pclang -rewrite-objcmain.m
- 是c++ 的文件!
-最后输入: popen main.cpp
-你会看到一些,好吧!初学的人看看,心中会问神马来的???:
当程序执行[object doSomething]时,会向消息接收者(object)发送一条消息(doSomething),runtime会根据消息接收者是否能响应该消息而做出不同的反应.
- 也许你发现了什么?嗯,是的。大部分都是 objc_XXX
这里需要注意!我们要了解一个重要的 isa
- isa:在Objective-C中,所有的类本身就是一个 【对象】 ,这个对象的Class里面有一个【isa指针】,它指向metaClass(元类).
- 你也可以这样理解:###在 Objective-C,一个对象的类由它的 isa 指针决定。isa 指针指向这个对象的 Class
代码就是这个样子:
typedef struct objc_object {
Class isa;
} *id;
我们可以总结一下: 任何结构体只要以一个指向 Class 结构的指针开始的就可以被当成是 objc_object。
也许你可能这么问?那这对象有啥用?
- 好吧!它的最大用处无非是用来发送消息的咯!
- 向对象发送消息的时候,runtime 沿着对象的 isa 指针找到了这个对象的 Class 结构体。 Class 结构体中包含了一个这个类的方法列表和一个指向父类的指针,用于查找继承的方法。
- 还有一点注意的是,这个Class结构体中定义了一个消息,那就是你可以发送的对象!
- super_class:指向该类的父类,如果该类已经是最顶层的根类(如NSObject或NSProxy),则super_class为NULL。
- cache:用于缓存最近使用的方法。一个接收者对象接收到一个消息时,它会根据isa指针去查找能够响应这个消息的对象。在实际使用中,这个对象只有一部分方法是常用的,很多方法其实很少用或者根本用不上。这种情况下,如果每次消息来时,我们都是methodLists中遍历一遍,性能势必很差。这时,cache就派上用场了。在我们每次调用过一个方法后,这个方法就会被缓存到cache列表中,下次调用的时候runtime就会优先去cache中查找,如果cache没有,才去methodLists中查找方法。这样,对于那些经常用到的方法的调用,但提高了调用的效率。
- version:我们可以使用这个字段来提供类的版本信息。这对于对象的序列化非常有用,它可是让我们识别出不同类定义版本中实例变量布局的改变。
- 好虚啊,有木有,好下面咋们去实战一下!别忘了给赞!
-下载请点击:源码下载
扩展一下:关于ARC&MRC
ARC是在运行时完成对象的Retain和Release的,不需要程序员参与
苹果公司的编译器开发人员对ARC已经做过无数次测试,可以说用ARC几乎不会出现内存管理错误的情况
另外由于编译的额外优化,使得ARC的代码比程序员手动管理内存的代码执行效率要高很多