zoukankan      html  css  js  c++  java
  • self、 superclass 、 super的区别

    self、 superclass 、 super

    self : 当前方法的调用者
    class:获取方法调用者的类对象
    superclass:获取方法调用者的父类对象
    super:不是一个指针,编译指示器(标识符),在程序编译时内部会做一些特殊处理
     super的本质:其实还是当前对象去调用,只不过让当前对象去调用父类方法, super不是父类对象,指的是父类方法。
    
    验证:

    在一个main.m文件中定义一个Person类,重写description方法。

    #import <objc/message.h>
    
    @interface Person : NSObject
    
    @end
    
    @implementation Person
    
    - (NSString *)description
    {
        // super:当前对象调用
        // 调用NSObject方法
       return [super description];
    }
    
    @end
    
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
    
        }
        return 0;
    }
    

    在终端使用cd命令跳转的main.m所在的目录下,然后输入:clang -rewrite-objc main.m 命令,便可以将main.m文件转换为mian.cpp文件,打开文件在文件的末尾出可以看到[super description]这句代码的底层实现如下:

    ((NSString *(*)(__rw_objc_super *, SEL))(void *)objc_msgSendSuper)((__rw_objc_super){(id)self, (id)class_getSuperclass(objc_getClass("Person"))}, sel_registerName("description"));
    

    将上面代码简化掉强制类型转换后代码如下:

    objc_msgSendSuper({self, class_getSuperclass(objc_getClass("Person"))}, sel_registerName("description"))
    

    其中{self,class_getSuperclass(objc_getClass("Person"))}j即为super的底层实现,所以使用super调用父类的方法,其本质仍是当前对象调用父类的方法。

     // ViewController.m文件
    - (void)viewDidLoad {
        // 创建SubPerson
        SubPerson *subP = [[SubPerson alloc] init];
    
        [subP test];
    }
    
    //Person.m 文件
    - (void)test
    {
        NSLog(@"%@ %@ %@ %@",[self class], [self superclass], [super class], [super superclass]);
    }
    
    //SubPerson.m 文件
    - (void)test
    {
        // 测试1
        NSLog(@"%@ %@ %@ %@",[self class], [self superclass], [super class], [super superclass]);
    
        // 测试2
        [super test];
    }
    

    测试1打印结果为:SubPerson Person SubPerson Person

    测试2打印结果为:SubPerson Person SubPerson Person

  • 相关阅读:
    14_java之变量|参数|返回值|修饰符
    NYOJ 202 红黑树 (二叉树)
    NYOJ 138 找球号(二) (哈希)
    NYOJ 136 等式 (哈希)
    NYOJ 133 子序列 (离散化)
    NYOJ 129 树的判定 (并查集)
    NYOJ 117 求逆序数 (树状数组)
    NYOJ 93 汉诺塔 (数学)
    HDU 2050 折线分割平面 (数学)
    天梯赛L2-008 最长对称子串 (字符串处理)
  • 原文地址:https://www.cnblogs.com/mengfei90/p/5129910.html
Copyright © 2011-2022 走看看