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;
}

浙公网安备 33010602011771号