//FYPPerson.h
@interface FYPPerson : NSObject
-(void)run;
@end
//FYPPerson.m
#import "FYPPerson.h"
@implementation FYPPerson
-(void)run
{
NSLog(@"run -----");
}
@end
//FYPStudent.h
#import "FYPPerson.h"
@interface FYPStudent : FYPPerson
@end
//FYPStudent.m
#import "FYPStudent.h"
@implementation FYPStudent
-(void)run {
[super run];
/*
本质调用 objc_msgSendSuper((__rw_objc_super){
(id)self,
(id)class_getSuperClass(objc_getClass("MJStudent"))}, @selector(run));
可写为
struct __rw_objc_super arg ={(id)self,
(id)class_getSuperClass(objc_getClass("MJStudent"))};
objc_msgSendSuper(arg, @selector(run));
因为
struct objc_super{
id receiver; // 消息接收者
Class super_class; // 消息接收者的父类
}
所以
struct __rw_objc_super arg ={(id)self,[MJPerson class]};
虽然调用的是[super run],但实际上消息接收者仍然是FYPStudent对象, 父类的作用是告诉你从哪里搜索这个方法. 这个run是从父类的类对象中开始找
*/
//
}
@end
总结代码
#import "FYPStudent.h"
#import <objc/runtime.h>
@implementation FYPStudent
-(void)run {
[super run];
/*
本质调用 objc_msgSendSuper((__rw_objc_super){
(id)self,
(id)class_getSuperClass(objc_getClass("MJStudent"))}, @selector(run));
可写为
struct __rw_objc_super arg ={(id)self,
(id)class_getSuperClass(objc_getClass("MJStudent"))};
objc_msgSendSuper(arg, @selector(run));
*/
//
}
- (instancetype)init
{// [super message]的底层实现 1 消息接收者仍然是子类对象,2 只不过是从父类的方法中开始查找方法
self = [super init];
if (self) {
objc_msgSend(self,@selector(class));
NSLog(@"[self class] = %@", [self class]); // FYPStudent
NSLog(@"[self superclass] = %@", [self superclass]); // FYPPerson
NSLog(@"---------------");
objc_msgSendSuper(self,[[FYPPerson alloc]init],@selector(class));
NSLog(@"[super class] = %@", [super class]); // FYPStudent 找到的方法实现在NSObject
//[self class]e和[super class]最终找到的方法实现都在NSObject中,所以是调用了NSObject的class方法
NSLog(@"[super superclass] = %@", [super superclass]); // FYPPerson
}
return self;
}
@end
@implementation NSObject
- (Class)class {
// 谁调用class就返回谁的类对象
return object_getClass(self);
}
- (Class)superClass {
return class_getSuperclass(object_getClass(self));
}
@end