美文网首页
iOS self和super的区别

iOS self和super的区别

作者: liang1030 | 来源:发表于2021-07-13 15:49 被阅读0次

代码一:

父类

#import <Foundation/Foundation.h>

@interface Person : NSObject

@end

@implementation Person

@end
-------------------------------------
子类

#import "Person.h"

@interface Student : Person

@end

@implementation Student

- (instancetype)init
{
    self = [super init];
    if (self) {
        NSLog(@"%@",[self class]);
        NSLog(@"%@",[self superclass]);
        NSLog(@"%@",[super class]);
        NSLog(@"%@",[super superclass]);
    }
    return self;
}

@end

输出:

2021-07-13 15:45:01.232941+0800 ThreadTest[35515:2085159] Student
2021-07-13 15:45:01.233047+0800 ThreadTest[35515:2085159] Person
2021-07-13 15:45:01.233110+0800 ThreadTest[35515:2085159] Student
2021-07-13 15:45:01.233159+0800 ThreadTest[35515:2085159] Person

代码二:

父类

#import <Foundation/Foundation.h>

@interface Person : NSObject

@end

@implementation Person

- (Class)class {
    return [NSObject class];
}

@end
-------------------------------------
子类

#import "Person.h"

@interface Student : Person

@end

@implementation Student

- (instancetype)init
{
    self = [super init];
    if (self) {
        NSLog(@"%@",[self class]);
        NSLog(@"%@",[self superclass]);
        NSLog(@"%@",[super class]);
        NSLog(@"%@",[super superclass]);
    }
    return self;
}

@end

输出:

2021-07-13 15:50:17.152639+0800 ThreadTest[35574:2090248] NSObject
2021-07-13 15:50:17.152789+0800 ThreadTest[35574:2090248] (null)
2021-07-13 15:50:17.152887+0800 ThreadTest[35574:2090248] NSObject
2021-07-13 15:50:17.152974+0800 ThreadTest[35574:2090248] (null)

代码三:

父类

#import <Foundation/Foundation.h>

@interface Person : NSObject

@end

@implementation Person

@end
-------------------------------------
子类

#import "Person.h"

@interface Student : Person

@end

@implementation Student

- (instancetype)init
{
    self = [super init];
    if (self) {
        NSLog(@"%@",[self class]);
        NSLog(@"%@",[self superclass]);
        NSLog(@"%@",[super class]);
        NSLog(@"%@",[super superclass]);
    }
    return self;
}

- (Class)class {
    return [Person class];
}

@end

输出:

2021-07-13 15:51:12.689477+0800 ThreadTest[35599:2091434] Person
2021-07-13 15:51:12.689588+0800 ThreadTest[35599:2091434] NSObject
2021-07-13 15:51:12.689658+0800 ThreadTest[35599:2091434] Student
2021-07-13 15:51:12.689741+0800 ThreadTest[35599:2091434] NSObject

原因:

self 是类的隐藏参数,指向当前调用方法的这个类的实例;

super 本质是一个编译器标示符,和 self 是指向的同一个消息接受者。不同点在于:super 会告诉编译器,当调用方法时,去调用父类的方法,而不是本类中的方法。

当使用 self 调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找;而当使用 super 时,则从父类的方法列表中开始找。然后调用父类的这个方法。

在调用[super class]的时候,runtime会去调用objc_msgSendSuper方法,而不是objc_msgSend;

参考:

https://blog.csdn.net/u012094456/article/details/102948350
https://www.jianshu.com/p/0ac20413f1db

相关文章

  • 深入了解runtime

    iOS经典讲解之[self class]和[super class]的区别 iOS的消息机制和消息转发 Objec...

  • Objective-C self与super的区别

    Objective-C self与super的区别 [self class] 和 [super class] 在当...

  • self、 superclass 、 super的区别

    self、 superclass 、 super的区别 self、 superclass 、 super self...

  • self和super的区别

    self和super的区别 self调用自己方法,super调用父类方法 self是类,super是预编译指令 [...

  • class

    1.[self class]和 [super class] self和super的区别: self是类的一个隐藏参...

  • iOS self和super的区别

    代码一: 输出: 代码二: 输出: 代码三: 输出: 原因: self 是类的隐藏参数,指向当前调用方法的这个类的...

  • iOS 之self和super区别

    要点: self 调用自己方法,super 调用父类方法 self是类隐藏参数,super是预编译指令 【self...

  • iOS 中 self 和 super 的区别

    一、要点: self调用自己方法,super调用父类方法 self是类,super是预编译指令 [self cla...

  • ios开发self和super的区别

    self 1.是关键字 2.代表当前方法的调用者。如果是类方法:代表当前类;如果是对象方法:代表当前类的对象 su...

  • ios开发self和super的区别

    self和super区别 self 是关键字代表当前方法的调用者如果是类方法:代表当前类如果是对象方法:代表当前类...

网友评论

      本文标题:iOS self和super的区别

      本文链接:https://www.haomeiwen.com/subject/relspltx.html