OC中super调用

//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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值