下面一道面试题:
@implementation Son : Father
- (id)init
{
self = [super init];
if (self) {
NSLog(@”%@”, NSStringFromClass([self class]));
NSLog(@”%@”, NSStringFromClass([super class]));
}
return self;
}
@end
很多iOS面试题库中都有这一道面试题,上面的结果为Son Son .
这里我就小记一下 class superClass super 各代表什么意思?
class:这里代表当前方法调用者的类
superClass:这里代表当前方法调用者的父类
super:只是一个编译器指示符,只要编译器看到super这个标识,就会让当前对象去调用父类的方法,本质还是当前对象,所以[super class]输出的结果为Son。
下面是一个demo
@interface Father : NSObject
-(void)test;
@end
@implementation Father
-(void)test {
NSLog(@"%@,%@",[self class],[super class]);
//输出结果:Son,Son
}
@end
下面是Son的实现方法
@implementation Son
-(void)test {
[super test];
}
ViewController
#import "ViewController.h"
#import "Son.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[[[SubPerson alloc] init] test];
}
可以看到输出结果也为Son,Son ,上面说了super只是一个编译器指示符,虽然在父类Father中输出打印,但是是子类Son调用的父类方法,所以[self class] ,[super class] 依然打印Son,Son。
这里还涉及另外一个知识点,就是任何方法默认都有两个隐式参数(id self, SEL _cmd);