我们写实现一个super调用,然后使用汇编调试他,看看他是调用什么函数的

@interface MLCat : NSObject

@end

@implementation MLCat
- (void)test {
    [super class];
    NSLog(@"is cat");
}
@end

Untitled

从图片中我们可以知道[super class]是调用了objc_msgSendSuper2方法,那么objc_msgSendSuper2的底层实现是什么样子的呢,这里我们可以从源码中窥探

Untitled

汇编的流程可以看成,这里只讲非指针校验的

  1. 赋值消息接受者和当前消息接收者的class
  2. 调用CahceLookup,看到这里如果知道objc_msgSend的流程的同学,就会恍然大悟,这里进行cache查找,查找不到调用_ _objcmsgSend_uncached方法

找不到的情况最终都会调用lookUpImpOrForward(obj, sel, cls, LOOKUP_INITIALIZE | LOOKUP_RESOLVER)

obj 消息接受者:self

sel:方法选择器

cls:这里就是当前类的superClass

LOOKUP_INITIALIZE | LOOKUP_RESOLVER:如果方法找不到进行动态解析

总结