CSDN连接地址:http://write.blog.csdn.net/postlist
一、什么是Runtime?
Objective-Cruntime是一个实现Objective-C语言的C库。它是一门编译型语言、也是一门动态型的语言(这里强调下OC是静态类型语言),之前没接触runtime的时候也不觉着它有多重要,接触之后才发现其实runtime挺强大的。就拿我们在iOS开发中所使用的OC编程语言来讲,OC之所以能够做到即是编译型语言,又能做到动态语言,就是得益于runtime的机制。
二、Runtime的消息机制
大家都知道在C语言里边的函数调用到了OC里边就变成了另外一个名字,称之为消息发送。即objc_msgSend,这就是利用了runtime的消息机制特性,完成了一个动态调用的过程。举个能有代表性的例子说明一下吧:例如:写了一个方法【receiver message】
receiver它在编译的阶段会向接收者发送message这条消息,可是它只是发送了一条message消息并没有真正意义上的去做事情,而对于receive来讲要如何响应这条消息,其实是在运行的时候它才会将【receiver message】转化成objc_msgSend(receiver, selector),【注释:如果消息含有参数的话则为:objc_msgSend(receiver, selector, arg1, arg2, …)。】
其实就相对于这个例子而言,这个对象消息的发送与方法的真正实现是在程序运行阶段才将其绑定在一起的,并不是编译的阶段完成的工作。如果消息的接收者能够找到对应的selector,那么就相当于直接执行了接收者这个对象的特定方法;否则,消息要么被转发,或是临时向接收者动态添加这个selector对应的实现内容,要么就干脆玩完崩溃掉。
三、Runtime中的相关定义及一些常见的方法
(一)、相关定义
#1、typedef struct objc_method *Method;【 描述类中的一个方法】
#2、typedef struct objc_ivar *Ivar;【实例变量】
#3、typedef struct objc_category *Category;【 类别Category】
#4、typedef struct objc_property *objc_property_t;【 类中声明的属性】**
(二)、常见的一些方法含义
#1、class_copyPropertyList ;【 获取一份拷贝的成员列表数组】
#2、property_getName;【获取成员名称】
#3、class_getInstanceVariable;【 获取成员对象的Ivar】
#4、object_getIvar从Ivar;【对象中取值】
#5、object_setIvar;【赋值函数】
本来还想要多写一些但是看了几篇前辈们写的几乎已经把我要总结的涵盖到里边了,所以在这里就把我个人感觉几个写的比较好的文章链接附在下边,希望能帮助到大家!也希望大家能指出我写的文章中的错误,以便纠正!谢谢!
链接一(来自 cocoChina网站)
http://www.cocoachina.com/ios/20141018/9960.html
链接二 (来自简书)
//www.greatytc.com/p/927c8384855a