@interface Person : NSObject
- (void)run;
@end
@implementation Person
- (void)run
{
NSLog(@"%s", __func__);
}
@end
@interface Student : Person
@end
@implementation Student
//重寫run方法
- (void)run
{
// super調(diào)用的receiver仍然是Student對象
[super run];
//底層實現(xiàn)
// struct objc_super arg = {self, [Person class]};
// objc_msgSendSuper(arg, @selector(run));
}
@end
[super message]的底層實現(xiàn)
1.消息接收者仍然是子類對象
2.從父類開始查找方法的實現(xiàn)
//結(jié)構(gòu)
struct objc_super {
__unsafe_unretained _Nonnull id receiver; // 消息接收者
__unsafe_unretained _Nonnull Class super_class; // 消息接收者的父類
}
無論是[self class]還是[super class]找到的class都是在NSObject里面 只不過[self class]是從當前類對象開始查找 [super class]是從當前類對象的父類開始查找
Student調(diào)用init方法
- (instancetype)init
{
if (self = [super init]) {
//objc_msgSend(self, @selector(class));
NSLog(@"[self class] = %@", [self class]); // Student
NSLog(@"[self superclass] = %@", [self superclass]); // Person
NSLog(@"--------------------------------");
// objc_msgSendSuper({self, [Person class]}, @selector(class));
//看起來是[super class],但是方法調(diào)用者還是self,
NSLog(@"[super class] = %@", [super class]); // Student
//當前類型是Student 父類是Person
NSLog(@"[super superclass] = %@", [super superclass]); // Person
}
return self;
}
NSObject的實現(xiàn)大概
@implementation NSObject
//返回值取決于self即消息接受者,誰調(diào)用就返回誰的類型
- (Class)class
{
return object_getClass(self);
}
//把self傳進去 獲取當前類型 再告訴當前類型的父類
- (Class)superclass
{
return class_getSuperclass(object_getClass(self));
}
@end