- runtime简称运行时机制,其中最主要的是消息机制,也是oc的一大特点。
- 对于c语言而言,在编译的时候就会去决定要调用哪一个函数。编译完成之后直接就顺序执行了,即编译的时候就确定了函数调用顺序。
- 而相比较oc语言,在编译的时候可以调用任何函数,只要声明就可以,而c语言的话会报错,换句话说oc在编译的时候并不能直接决定调用哪个函数,只有在真正运行的时候才会根据函数的名称区执行相对应的方法,属于动态调用过程。
- oc如何实现动态调用
[person read];
- person是个对象,read是函数名, 在iOS中对象都继承与NSObject,而NSObject中存在许许多多的标记(指针),指向父类的(如果父类没有则为NULL)、指向本类方法的、指向属性的,其中有个名为isa的指针(指向自己这个类)
- 在编译的时候,编译器会将上面的代码转换为一个标记即指针(isa)和一个方法选择器(@selector(read)),这个方法选择器指定了要选定的方法,即read.
- 首先通过isa标记去找这个类,找到这个类后,在类中通过方法选择器找到要执行的方法
- 如果没有找到这个类,就去这个类中别的指针标记的地方去找,都没有找到就报错了
- 如果找到了这个类,就通过方法选择器到类中寻找选定的方法。
- 如果没有找到选定方法就报错
- 如果找到了这个选定方法
- 先将这个指针加到cache中,(这个cache就是用来标记这个类最近使用的方法的指针,有点绕,就是存储一个指针,这个指针是指向这个类最近使用的函数,可以提升效率)
- 然后就可以通过选定方法自带的指针跳转到对应的方法里面执行了.