iOS中runtime机制
runtime也叫动态运行时,OC是一门动态语言,他会将一些工作放在代码运行时处理而不是编译时,也就是说,很多类和变量在编译时的类型我们是不知道的,因此它需要一个编译器和运行时系统来动态创建类、对象进行消息传递(也就是方法调用)。
在OC中对象调用方法是[object method]的形式,对象在调用该方法时编译器会将该方法调用转换成消息发送objc_msgSend(object,method),而在runtime执行过程是通过object的指针找到他的类,在类里面的方法集合里面找到method方法,如果没找到就到他的父类里面找,如此一致找下去,一旦找到就去执行;
在runtime的使用
1、SEL(selector)方法选择器;
2、id类型,他是指向某个实例的指针,指向什么类型就是什么类型;
3、Class(类)他是一个结构体指针,我么可以动态添加成员方法,里面有objc_ivar_list存储成员变量列表和objc_ivar存储单个成员变量,为了处理类和对象的关系,runtime库创建了一个叫Meta Class的元类,类对象所属的类叫做元类,Meta Class表述了类对象所具备的元数据;
4、Method类中方法类型;
5、Property,可以获取类运行时的属性;
6、Cache,从runtime执行过程我们可以看出如果每次调用方法都这样查找,特别是同样的方法多次调用的情况下,每次都要去查找类,父类以及遍历方法集合找到调用的方法,效率必然会很低。objc_cache缓存就是将我们调用的方法第一次查找到之后缓存起来,以键值对的方式存起来,method_name作为key,方法访问的之后优先从缓存中读取,我们也知道字典中以key查询效率是最高的,这样大大提高了查询效率。