super关键词经常使用,但是概念却有时候朦朦胧胧在此故意挖个坑,体会一下绕坑的感觉
先上代码:
main.m文件
#import "ViewController.h"
#import "SubPerson.h"
void main(){
SubPerson *p = [[SubPerson alloc] init];
[p test];
}
- Person.h文件
#import <Foundation/Foundation.h>
@interface Person : NSObject
- (void)test;
@end
- Person.m文件
#import "Person.h"
@implementation Person
- (void)test{
//结果验证 self -> SubPerson
// SubPerson Person SubPerson Person
NSLog(@"Person中的打印:%@ %@ %@ %@",[self class], [self superclass], [super class], [super superclass]);
}
@end
- 子类SubPerson.h文件
#import "Person.h"
@interface SubPerson : Person
@end
- 子类SubPerson.m文件
#import "SubPerson.h"
@implementation SubPerson
- (void)test
{
NSLog(@"SubPerson中的打印:%@ %@ %@ %@",[self class], [self superclass], [super class], [super superclass]);
//仅仅是让子类对象调用父类的方法,并没有改变调用者的身份
//即前面的执行对象改为自己,后面的方法替换为父类的方法来执行
[super test];
}
@end
最终输出结果子类打印和父类打印相同,总结:
- class: 获取方法调用者的类
- superclass: 获取方法调用者的父类
- super:super不是一个指针,super只是编译指示器
再来一个Demo:
@implementation SuperViewController
- (void) methodB{
NSLog(@"Super methodB.");
}
- (void) methodA{
NSLog(@"Super methodA.");
[self methodB];
}
@end
///////////////////////////////////////////////////////
@implementation SubViewController
- (void)viewDidLoad {
//......
[super methodA];
[self methodA];
}
- (void) methodB{
NSLog(@"Sub methodB.");
}
- (void) methodA{
NSLog(@"Sub methodA.");
}
@end
- 输出结果:
Super methodA.
Sub methodB.
Sub methodA.