super 与 superclass subclass

来源:互联网 发布:win10 占用80端口 编辑:程序博客网 时间:2024/06/08 05:13

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(@"%@   %@   %@   %@",[selfclass],[superclass],[selfsuperclass],[[selfsuperclass] 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 {

    [superviewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    

    

    // super 表示用当前对象去调用父类的方法,即还是用当前对象去调用方法

    Person *per = [[Personalloc] init];

    [per test];

    son *s = [[sonalloc] init];

    [s test];

    daughter *da = [[daughteralloc] 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






原创粉丝点击