iOS self和super的区别

2021-07-13  本文已影响0人  liang1030

代码一:

父类

#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

上一篇 下一篇

猜你喜欢

热点阅读