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 {// 创建SubPersonSubPerson *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

转载于:https://www.cnblogs.com/mengfei90/p/5129910.html

self、 superclass 、 super的区别相关推荐

  1. Object-C中self和super的区别

    self与super的区别 原文CSDN evilotus 有所整理 **** 在ObjC中的类实现中经常看到这两个关键字"self"和"super",以以前o ...

  2. this和super的区别

    this和super的区别? 分别是什么呢? this代表本类对应的引用. super代表父类存储空间的标识(可以理解为父类引用,可以操作父类的成员) 子类中所有的构造方法默认都会访问父类中空参数的构 ...

  3. 【Java】泛型中 extends 和 super 的区别?

    <? extends T>和<? super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. ...

  4. python3类的继承详解_python3中类的继承以及self和super的区别详解

    python中类的继承: 子类继承父类,及子类拥有了父类的 属性 和 方法. python中类的初始化都是__init__().所以父类和子类的初始化方式都是__init__(),但是如果子类初始化时 ...

  5. Java基础之this关键字和super关键字区别

    this关键字和super关键字区别 » this关键字 ■ 代表当前这个对象 ■ this可以访问本类中的实例变量.实例方法也可以方法本类中的其他构造方法 ■ this还可以访问父类中的实例变量.实 ...

  6. ? extends E 和 ? super E 区别和使用

    <? extends E>和<? super E>区别和使用 先看代码,在这类定义一下类的继承关系 class World { }class Person extends Wo ...

  7. 第三周 Java语法总结__static关键字__代码块__继承__this和super的区别__重写__final关键字__多态__抽象__接口__形参问题__包__权限修饰符__内部类

    文章目录 6.static关键字 1)静态static关键字的特点: 2)关于static关键字的使用注意事项 3)什么时候将变量定义为成员变量: 7.文档说明书: 8.代码块 9.继承 1)继承的概 ...

  8. Java中this与super的区别

    2019独角兽企业重金招聘Python工程师标准>>> this与super关键字在java中构造函数中的应用:  ** super()函数 **  super()函数在子类构造函数 ...

  9. android super this区别

    参考http://blog.163.com/qq3076169@126/blog/static/1717240672012620111028892/ 为什么要使用this,简单讲,就是方法中的某个形参 ...

最新文章

  1. Linux大文件传输(转)
  2. 图片序列化和反序列化成图片文件(代码)
  3. java 实体类 代码重复_java – JPA两个单向@OneToMany关系到同一个实体导致重复输入...
  4. java将dxf展示在网页_七天串起java技术栈-第四天
  5. ansible免密登录和账号登录方式
  6. 如何获取maven命令执行后成功与否的返回值
  7. MySQL基础(常用的语句)
  8. 将坐标系统保存为一个文件.prj
  9. MySQL修改数据表中的字段名_MySQL修改数据表中的字段名
  10. 【上班摸鱼系列】文字选择类游戏:《职员默示录 - 启》末日丧尸爆发,你,是什么下场!?...
  11. Pidgin 插件法解决Ubuntu11.10 QQ
  12. redis持久化机制,深入分析redisAOF和RDB模式的利弊
  13. 柴胡加龙骨牡蛎汤去大黄合当归芍药散治顽固心悸案(李跃海)
  14. p值>0.05,统计意义上不显著?
  15. apmserv mysql5.1启动失败_使用APMServ时出现“1、Apache启动失败,请检查相关配置。√MySQL5.1已启动。”错误的终极解决办法:...
  16. 微信开发之微信网页授权 完整示例
  17. 华为方舟编译器开源官网正式上线:源代码已开放下载;中兴通讯与北京交通大学、中国移动北京公司签署 “5G战略合作框架协议”……...
  18. 红米手机计算机的隐藏功能,红米手机按键隐藏神功能,米粉很多人都不全懂!...
  19. nvm 下载安装及相关命令
  20. c++ 孟岩推荐 书籍

热门文章

  1. Winform中ComcoBox控件设置选定项
  2. JS:ES6-8 Promise入门
  3. 【操作系统】—处理机调度的概念以及层次
  4. 以前的(山寨机)手机是怎么逐渐消失的?
  5. 一次性存入多少钱就可以有资格跟银行商谈利息了?
  6. 你看过最好的心理学书籍是什么?
  7. 建议手机电池85%以下去换电池
  8. 路由器太远手机接收不到信号怎么办
  9. 钱放在支付宝好,还是微信好,还是存在银行好?
  10. 如果你现在很穷,很苦,不要苦恼