objective-c中super语法与Java中的super类似,都是通过super调用对应的父类方法|构造函数。
通过super可以执行父类中被覆盖的方法,例如以下代码:
父类相关的定义与实现:
* 父类<MyClass>对象定义:
@interface MyClass : NSObject
@property(nonatomic,retain) NSString * strZhengJieWindowsMyFiles;
+ (void) test;
@end
* 父类<MyClass>对象实现:
@implementation MyClass
- (instancetype)init
{
self = [super init];
if (self) {
NSLog(@"父类的init构造方法");
}
return self;
}
+ (void) test{
NSLog(@"父类的Test方法");
}
@synthesize strZhengJieWindowsMyFiles;
@end
子类的相关定义与实现:
* 子类<MyChildClass>对象定义:
@interface MyChildClass : MyClass
@end
* 子类<MyChildClass>对象实现:
@implementation MyChildClass
- (instancetype)init
{
self = [super init];
if (self) {
NSLog(@"子类的init构造方法");
}
return self;
}
+(void)test{
[super test];
NSLog(@"子类的Test方法");
}
@end
在main方法中执行对应的创建和调用:
int main(int argc, const char * argv[]) {
MyChildClass *myChildClass = [[MyChildClass alloc] init];
//通过对象获取子类对象,然后执行子类对象的test方法
[[myChildClass class] test];
return 0;
}
执行结果:
2018-06-04 11:02:57.537909+0800 TestObjective-C[2240:69324] 父类
2018-06-04 11:02:57.538842+0800 TestObjective-C[2240:69324] 子类
2018-06-04 11:02:57.539241+0800 TestObjective-C[2240:69324] 父类的Test方法
2018-06-04 11:02:57.539559+0800 TestObjective-C[2240:69324] 子类的Test方法
Program ended with exit code: 0
从执行结果中得出结论:
在执行子类的test方法时,如果向super发送调用消息后,会执行对应父类的方法。从代码中得知子类在实例化对象前需要先实例化父类对象。对super发送消息可以调用父类同名的方法。如果父类中没有该声明的方法,则会按照通常的方式在继承链中继续查找对应的消息。
注意: 默认情况下,通过对super发送调用消息需要父类的.h头文件中定义对应的类或对象方法,否则子类无法调用父类的私有方法。