super

作者: Berning | 来源:发表于2021-11-05 19:05 被阅读0次

示例

#import "NSPerson.h"

@interface NSStudent : NSPerson

- (void)superTest;

@end

#import "NSStudent.h"

@implementation NSStudent

- (void)superTest
{
    NSLog(@"self_class:%@",[self class]);
    NSLog(@"self_superclass:%@",[self superclass]);
    NSLog(@"super_class:%@",[super class]);
    NSLog(@"super_superclass:%@",[super superclass]);
}

@end
#import "NSStudent.h"

int main(int argc, const char * argv[]) {
        
    NSStudent *student = [[NSStudent alloc] init];
    [student superTest];
    return 0;
}

//log
2020-08-27 23:59:48.669409+0800 runtime[14450:547436] self_class:NSStudent
2020-08-27 23:59:48.669912+0800 runtime[14450:547436] self_superclass:NSPerson
2020-08-27 23:59:48.670006+0800 runtime[14450:547436] super_class:NSStudent
2020-08-27 23:59:48.670052+0800 runtime[14450:547436] super_superclass:NSPerson
Program ended with exit code: 0

self

[self class]、[self superclass]调用流程

    ((Class (*)(id, SEL))(void *)objc_msgSend)((id)self, sel_registerName("class"));
    ((Class (*)(id, SEL))(void *)objc_msgSend)((id)self, sel_registerName("superclass"));

super

[super class]、[super superclass]调用流程

struct objc_super {
    id receiver;
    Class super_class;
};

id  objc_msgSendSuper(struct objc_super * _Nonnull super, SEL _Nonnull op, ...)

    ((Class (*)(__rw_objc_super *, SEL))(void *)objc_msgSendSuper)((__rw_objc_super){(id)self, (id)class_getSuperclass(objc_getClass("NSStudent"))}, sel_registerName("class"));
    ((Class (*)(__rw_objc_super *, SEL))(void *)objc_msgSendSuper)((__rw_objc_super){(id)self, (id)class_getSuperclass(objc_getClass("NSStudent"))}, sel_registerName("superclass"));

说明:super调用方法,本质是调用objc_msgSendSuper给对象发送消息

objc_msgSendSuper第一个参数struct objc_super * _Nonnull super是一个结构体,封装了消息接收者(receiver)和父类对象(super_class)

第二个参数是方法本身

通过源码可以看出,消息接收者receiver仍然是当前对象self ,suerper_class是当前对象类对象的父类,作用是查找方法时从父类开始查找

注意:转换成的c++代码与程序实际运行转换成的代码有出入.
实际运行过程中,是调用objc_msgSendSuper2, 第一个参数struct objc_super * _Nonnull super结构体内部的第二个成员变量就是当前类

相关文章

  • Super, super, super, super happy

    Parent diaries for 137th days weather:sunny Wed...

  • Super, super, super, super fun d

    亲子日记第136天 天气:晴 星期二 今天是周二,超级超级超级超级超级超级开心的一天٩(๑^o...

  • Class中的super简析

    super当作函数使用 super()执行父类的构造函数 super() 返回的是子类的实例,即 super 内部...

  • reactES6写法

    注意: super()是为了使用this,必须在使用this之前声明super(); super(props)这个...

  • JAVA面试题

    Q:super()与 this()的区别? A:This():当前类的对象,super 父类对象。 Super()...

  • iOS - super | super | super clas

    super 是编译器的指示符,不是指针,只是一个标识符,代表调用父类的方法,调用者还是自己本身 superclas...

  • super

    super关键字的使用 super理解为:父类的 super可以用来调用:属性、方法、构造器 super的使用:(...

  • Java 泛型 <? super T> 中 supe

    Java 泛型 中 super 怎么 理解?与 extends 有何不同? super只能...

  • Wildcards with super

    What is Wildcards with super The quizzical phrase ? super...

  • Java中Super()与this()

    Java中Super()与this() super指父类,this指当前对象super()与this()都必须在构...

网友评论

      本文标题:super

      本文链接:https://www.haomeiwen.com/subject/olkksktx.html