super : 一个编译修饰符,表示用当前对象去调用父类的方法
superclass:获取调用者的父类
验证:
父类:
#import <Foundation/Foundation.h>
@interface Persion : NSObject
@property (nonatomic,copy) NSString *name;
-(void)test;
@end
#import "Persion.h"
@implementation Persion
-(void)test{
NSLog(@"%@ %@ %@ %@",[self class],[super class],[self superclass],[[self superclass] class]);
}
@end
子类
#import "Persion.h"
@interface son : Persion
@end
#import "son.h"
@implementation son
@end
#import "Persion.h"
@interface daughter : Persion
@end
#import "daughter.h"
@implementation daughter
@end
ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// super 表示用当前对象去调用父类的方法,即还是用当前对象去调用方法
Person *per = [[Person alloc] init];
[per test];
son *s = [[son alloc] init];
[s test];
daughter *da = [[daughter alloc] init];
[da test];
// NSLog(@"self %@",self);
// NSLog(@"self class: %@",[self class]);
// NSLog(@"self super class: %@",[self superclass]);
// NSLog(@"self super class class: %@",[[self superclass] class]);
// NSLog(@"self super class super class: %@",[[self superclass] superclass]);
// NSLog(@"superclass superclassclass : %@",[[[self superclass] superclass] class]);
// NSLog(@"superclass superclassclass : %@",[[[self superclass] superclass] superclass]);
// NSLog(@"superclass superclassclass : %@",[[[[self superclass] superclass] superclass] superclass]);
// Persion *per = [[Persion alloc] init];
//
// NSLog(@"111 %@ %p",per,per);
// NSLog(@"222 %@ %p",[per class],[per class]); // 第一次的class是实例方法,通过isa指向实例的类
// NSLog(@"222 %@ %p",[[per class] class],[[per class] class]);// 第二次的class是类方法,返回的是类对象本身
// NSLog(@"444 %@ %p",[per superclass],[per superclass]);
// NSLog(@"%@ %p",[[per superclass] superclass],[[per superclass] superclass]);
// NSLog(@"222 %@ %p",object_getClass(per),object_getClass(per));
// NSLog(@"444 %@ %p",object_getClass(object_getClass(per)),object_getClass(object_getClass(per)));
// NSLog(@"%@ %p",object_getClass(object_getClass(object_getClass(per))),object_getClass(object_getClass(object_getClass(per))));
// NSLog(@"%@",object_getClass(object_getClass(object_getClass(object_getClass(per)))));
}
打印结果
per调用[super class] 是per去调用Person的父类NSObject的class方法,不是NSObject去调用class方法,而class方法是获取调用者的类名,所以per调用[super class] 结果仍为Persion类
子类s调用 [super class] 时,是用s去调用父类的class方法,这里的class 是 s 的父类person的class方法
s的superclass是Person
Person的superclass是NSObject
创建对象的类本身也是对象,称为类对象,类对象中存放的是描述实例相关的信息,例如实例的成员变量,实例方法类对象里的isa指针指向Subclass(meta),Subclass(meta)也是一个对象,是原类对象,原类对象中存放的是描述类相关的信息,例如类方法
参考:http://tech.yunyingxbs.com/article/detail/id/232.html