[self class]与[super class]

@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 /* struct objc_super *super, SEL op, ... */ )

/// Specifies the superclass of an instance. 
struct objc_super {
    /// Specifies an instance of a class.
    __unsafe_unretained id receiver;

    /// Specifies the particular superclass of the instance to message. 
#if !defined(__cplusplus)  &&  !__OBJC2__
    /* For compatibility with old objc-runtime.h header */
    __unsafe_unretained Class class;
#else
    __unsafe_unretained Class super_class;
#endif
    /* super_class is the first class to search */
};
在objc_msgSendSuper方法中,第一个参数是一个objc_super的结构体,里边有两个变量,一个是接收消息的receiver,一个是当前类的父类super_class
因为objc_super->receiver是self,也就是Son,所以两个输出都是Son

原文地址:https://www.cnblogs.com/yangyangyang/p/6744190.html