@implementation Son : Father
- (id)init { self = [super init]; if (self) { NSLog(@"%@", NSStringFromClass([self class])); NSLog(@"%@", NSStringFromClass([super class])); } return self; } @end
self是类的一个隐藏参数,每个方法的实现的第一个参数即为self
super并不是隐藏参数,它实际上只是一个“编译器标识符”,它负责告诉编译器当调用方法时去调用父类的方法,而不是本类中的方法
在调用[super class]的时候,runtime会去调用objc_msgSendSuper方法,而不是objc_msgSend
OBJC_EXPORT void objc_msgSendSuper(void
在objc_msgSendSuper方法中,第一个参数是一个objc_super的结构体,里边有两个变量,一个是接收消息的receiver,一个是当前类的父类super_class
因为objc_super->receiver是self,也就是Son,所以两个输出都是Son