在每个类中都有一个Dispatch Table,这个Dispatch Table本质是将类中的SEL和IMP(可以理解为函数指针)进行对应。而我们的Method Swizzling就是对这个table进行了操作,让SEL对应另一个IMP。
==================
对象如何找到对应的正确方法去调用:
对象方法保存在类中,类方法保存在元类中;
每一个类都有一个方法列表:method list;
(1) 明确去哪个类中调用方法;通过对象的isa指针,这个指针指向的就是这个实例对象的类对象;
(2) 根据传入的方法编号,也就是SEL编号,去方法列表中查找到对应的方法;
为什么苹果会使用方法编号?因为操作数字比操作字符串会快,那么传递方法的时候传递数字编号会提高效率;
(3) 根据方法编号找到了方法名(函数入口),然后根据这个方法名去内存中的方法区找到这个函数的实现!!!
网友评论