下面一道面試題:
@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);