我们写实现一个super调用,然后使用汇编调试他,看看他是调用什么函数的
@interface MLCat : NSObject
@end
@implementation MLCat
- (void)test {
[super class];
NSLog(@"is cat");
}
@end
从图片中我们可以知道[super class]是调用了objc_msgSendSuper2方法,那么objc_msgSendSuper2的底层实现是什么样子的呢,这里我们可以从源码中窥探
汇编的流程可以看成,这里只讲非指针校验的
找不到的情况最终都会调用lookUpImpOrForward(obj, sel, cls, LOOKUP_INITIALIZE | LOOKUP_RESOLVER)
obj 消息接受者:self
sel:方法选择器
cls:这里就是当前类的superClass
LOOKUP_INITIALIZE | LOOKUP_RESOLVER:如果方法找不到进行动态解析
super调用,底层会转换成objc_msgSendSuper2函数的调用,接收2个参数
objc_msgSendSuper2({self,object_getClass(self)}, sel_registerName(”class”))