前言
class是很多人经常使用的方法,而【self class】和【super class】的区别也在面试中经常使用到。如下所述:
#import "Person.h"
@interface Man : Person
@end
#import "Man.h"
@implementation Man
- (instancetype)init {
self = [super init];
if (self) {
NSLog(@"%@", [self class]);
NSLog(@"%@", [super class]);
}
return self;
}
@end
那么问题来了,控制台打印的值是什么?
追根溯源
源码实现
想知道这个值是什么的话,最简单的方式当然是跑一下咯。不过,这样做的话,一点都没有灵魂了。所以,我们就用clang编译一下这个文件,看看他在编译器中是怎么做的。命令是 clang -rewrite-objc XXX.m
。
编译后的后的CPP文件内容炒鸡多,我们找到关键的init方法(秘诀:翻到底部)如下:
static instancetype _I_Man_init(Man * self, SEL _cmd) {
self = ((Man *(*)(__rw_objc_super *, SEL))(void *)objc_msgSendSuper)((__rw_objc_super){(id)