OC是一门动态语言,其方法调用方式与C++还是有很大区别的。
具体的方法调用过程,可以参考下面一片枫叶的博客,写的还是很详细的。
对于OC的方法调用,有两个点是重点:
1、对于OC的一切方法调用,最终会转换为类似下面声明的C语言函数
id objc_msgSend ( id self, SEL op, ... );
该函数主要参数self,表面了方法消息的接受者(一般是调用方法的类对象本身),参数SEL表面了要调用的那个方法。"..."是C语言中的不定参数,来向要调用的方法传递参数。
2、对象的方法调用传递。
要理解OC中的方法调用,重点要理解下面这张图,
图中灰色的圆圈包含了isa指针与类对象的实例变量,这一部分是类对象的内存结构。
而isa作为指针又指向了另一部分,其实就是一个链表,isa指向了其第一个结点。
细看链表的每个结点,其包含了两部分
(1)指向父类的指针。
(2)自身的函数分发表。
当OC要调用方法时,会沿着这个链表一路查找,直到在函数分发表中找到要调用的函数为止。当然runtime会对这个过程进行优化,来缓存已经调用过得函数地址,不至于让我们每次都又沿着链表查找一遍。