iOS [self class]和[super class]

 创建一个继承于FVC的类SVC,FVC没有实现class方法

@implementation SVC:FVC

- (void)viewDidLoad {
    [super viewDidLoad];

    NSLog(@"self:%@",[self class]);
    NSLog(@"super:%@",[super class]);
}

@end

   

打印结果都是SVC

2018-08-16 10:39:25.601010+0800 selfsuperClass问题[1133:29988] self:SVC
2018-08-16 10:39:25.601142+0800 selfsuperClass问题[1133:29988] super:SVC

  

self:是类的隐藏参数,它指向当前调用方法的类的实例。

super:本质是一个编译器标识符,和self指向同一个消息接收者,和self不同的是,调用class时会去父类的的方法里调用而不是本类,

 

通过clang 生成.cpp文件上面的代码转换成如下代码

NSLog((NSString *)&__NSConstantStringImpl__var_folders_0m_1m83swp91gv89451mgbxgjzw0000gn_T_SVC_59c888_mi_0,((Class (*)(id, SEL))(void *)objc_msgSend)((id)self, sel_registerName("class")));

NSLog((NSString *)&__NSConstantStringImpl__var_folders_0m_1m83swp91gv89451mgbxgjzw0000gn_T_SVC_59c888_mi_1,((Class (*)(__rw_objc_super *, SEL))(void *)objc_msgSendSuper)((__rw_objc_super){(id)self, (id)class_getSuperclass(objc_getClass("SVC"))}, sel_registerName("class")));

 

  [self class] 转换成objc_msgSend 第一个参数self 第二个参数方法的SEL,之后是方法的参数

  第一个参数为self 当调用时会先调用本类的class方法 如果没有就沿继承体系往上找直到NSObject的class,而NSObject的class实现是返回self,所以输出SVC

objc_msgSend(void /* id self, SEL op, ... */ )

 

 [super class]转换成objc_msgSendSuper 第一个参数是 objc_super 结构体如下所示

 根据.cpp内容可知 receiver 是self(SVC),super_class是 class_getSuperclass(objc_getClass("SVC"))即SVC的父类FVC

 调用时先调用FVC的class方法,如果没有,就沿继承体系往上找直到NSObject的class,

   最后内部是使用objc_msgSend(objc_super->receiver, @selector("class"))去调用

 所以输出SVC

objc_msgSendSuper(void /* struct objc_super *super, SEL op, ... */ )
struct objc_super {
    __unsafe_unretained _Nonnull id receiver;
    __unsafe_unretained _Nonnull Class super_class;
}

  

 

 

posted @ 2018-08-16 14:13  马赛马拉  阅读(756)  评论(0)    收藏  举报