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