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

  • 相关阅读:
    (十四)配置的热更新
    (十三)在ASP.NET CORE中使用Options
    (十二)Bind读取配置到C#实例
    【转载】ViewState的用法
    【转载】Web Service和WCF的到底有什么区别
    【转载】小小的公共库,大大的耦合,你痛过吗?
    【转载】ASP.NET应用程序与页面生命周期
    【转载】分布式数据库架构--分库、分表、排序、分页、分组、实现
    【转载】ASP和ASP.NET根本区别
    【转载】聊一聊C#的Equals()和GetHashCode()方法
  • 原文地址:https://www.cnblogs.com/mengfei90/p/5129910.html
Copyright © 2011-2022 走看看