zoukankan      html  css  js  c++  java
  • OC之runtime(super)

    对于下面的代码,打印的结果是啥

    #import "LBStudent.h"
    
    @implementation LBStudent
    
    - (instancetype)init
    {
        self = [super init];
        if (self) {
            NSLog(@"[self class] = %@", [self class]);
            NSLog(@"[super class] = %@", [super class]);
            NSLog(@"[self superclass] = %@", [self superclass]);
            NSLog(@"[super superclass] = %@", [super superclass]);
        }
        return self;
    }
    @end

    调用之后打印结果如下:

    [self class] = LBStudent
    [super class] = LBStudent
    [self superclass] = LBPerson
    [super superclass] = LBPerson

    可以看到self和super调用class方法,打印的结果是一样的

    将上面OC代码转成C++代码之后得到如下代码:

    static instancetype _I_LBStudent_init(LBStudent * self, SEL _cmd) {
        self = ((LBStudent *(*)(__rw_objc_super *, SEL))(void *)objc_msgSendSuper)((__rw_objc_super){(id)self, (id)class_getSuperclass(objc_getClass("LBStudent"))}, sel_registerName("init"));
        if (self) {
            NSLog((NSString *)&__NSConstantStringImpl__var_folders_3q_7klqgj0j63z08zcx0skwjm500000gn_T_LBStudent_ad579e_mi_0, ((Class (*)(id, SEL))(void *)objc_msgSend)((id)self, sel_registerName("class")));
            NSLog((NSString *)&__NSConstantStringImpl__var_folders_3q_7klqgj0j63z08zcx0skwjm500000gn_T_LBStudent_ad579e_mi_1, ((Class (*)(__rw_objc_super *, SEL))(void *)objc_msgSendSuper)((__rw_objc_super){(id)self, (id)class_getSuperclass(objc_getClass("LBStudent"))}, sel_registerName("class")));
            NSLog((NSString *)&__NSConstantStringImpl__var_folders_3q_7klqgj0j63z08zcx0skwjm500000gn_T_LBStudent_ad579e_mi_2, ((Class (*)(id, SEL))(void *)objc_msgSend)((id)self, sel_registerName("superclass")));
            NSLog((NSString *)&__NSConstantStringImpl__var_folders_3q_7klqgj0j63z08zcx0skwjm500000gn_T_LBStudent_ad579e_mi_3, ((Class (*)(__rw_objc_super *, SEL))(void *)objc_msgSendSuper)((__rw_objc_super){(id)self, (id)class_getSuperclass(objc_getClass("LBStudent"))}, sel_registerName("superclass")));
        }
        return self;
    }

    从上面代码可以看出,super其实调用的是self的objc_msgSendSuper,而class方法是类继承于NSObject时拥有的,class的方法伪代码实现大概如下:

    - (Class)class {
        return  objc_getClass(self);
    }

    class是返回消息接收者的类,super只是代表从父类中开始查找,消息接受者仍然是self

  • 相关阅读:
    Android:UI界面设计基础知识总结(一)
    Test:河北金力集团企业网集成
    Java中的异常处理try catch(第八周课堂示例总结)
    Java第七周课堂示例总结
    初入JavaWeb(半成品)
    Redis详解(4)--redis底层数据结构
    Go语言流程控制05--defer延时执行
    java==IO练习,文件切割合拼工具开发代码
    【洛谷 P3772】[CTSC2017]游戏(矩阵乘法+线段树)
    【LOJ #2865】「IOI2018」狼人(Kruscal重构树+扫描线)
  • 原文地址:https://www.cnblogs.com/muzichenyu/p/14203733.html
Copyright © 2011-2022 走看看