以一道面试题开篇:
@implementation Son : Father
- (id)init
{
self = [super init];
if (self)
{
NSLog(@"%@", NSStringFromClass([self class]));
NSLog(@"%@", NSStringFromClass([super class]));
}
return self;
}
@end
这段语句的打印结果是什么?
按照Java语言的经验来看,答案应该是Son Father,但是实际编译运行后打印结果却是:Son Son。
下面我们来分析一下原因。
self和super是Objective-C的两个保留字,self是类的隐藏的参数,它指向当前调用方法的对象,另一个隐藏参数是_cmd,代表当前类方法的selector。而super并不是隐藏的参数,它仅仅是一个“编译器指示符”,它和self指向的是相同的消息接收者。对于上述代码而言,[self class]和[super class]的消息接收者都是Son这个对象,不同的是,super关键字告诉编译器当调用class方法时,要去调用父类中的方法。
对于其中的底层原理分析如下。