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 {// 创建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的区别相关推荐
- Object-C中self和super的区别
self与super的区别 原文CSDN evilotus 有所整理 **** 在ObjC中的类实现中经常看到这两个关键字"self"和"super",以以前o ...
- this和super的区别
this和super的区别? 分别是什么呢? this代表本类对应的引用. super代表父类存储空间的标识(可以理解为父类引用,可以操作父类的成员) 子类中所有的构造方法默认都会访问父类中空参数的构 ...
- 【Java】泛型中 extends 和 super 的区别?
<? extends T>和<? super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. ...
- python3类的继承详解_python3中类的继承以及self和super的区别详解
python中类的继承: 子类继承父类,及子类拥有了父类的 属性 和 方法. python中类的初始化都是__init__().所以父类和子类的初始化方式都是__init__(),但是如果子类初始化时 ...
- Java基础之this关键字和super关键字区别
this关键字和super关键字区别 » this关键字 ■ 代表当前这个对象 ■ this可以访问本类中的实例变量.实例方法也可以方法本类中的其他构造方法 ■ this还可以访问父类中的实例变量.实 ...
- ? extends E 和 ? super E 区别和使用
<? extends E>和<? super E>区别和使用 先看代码,在这类定义一下类的继承关系 class World { }class Person extends Wo ...
- 第三周 Java语法总结__static关键字__代码块__继承__this和super的区别__重写__final关键字__多态__抽象__接口__形参问题__包__权限修饰符__内部类
文章目录 6.static关键字 1)静态static关键字的特点: 2)关于static关键字的使用注意事项 3)什么时候将变量定义为成员变量: 7.文档说明书: 8.代码块 9.继承 1)继承的概 ...
- Java中this与super的区别
2019独角兽企业重金招聘Python工程师标准>>> this与super关键字在java中构造函数中的应用: ** super()函数 ** super()函数在子类构造函数 ...
- android super this区别
参考http://blog.163.com/qq3076169@126/blog/static/1717240672012620111028892/ 为什么要使用this,简单讲,就是方法中的某个形参 ...
最新文章
- Linux大文件传输(转)
- 图片序列化和反序列化成图片文件(代码)
- java 实体类 代码重复_java – JPA两个单向@OneToMany关系到同一个实体导致重复输入...
- java将dxf展示在网页_七天串起java技术栈-第四天
- ansible免密登录和账号登录方式
- 如何获取maven命令执行后成功与否的返回值
- MySQL基础(常用的语句)
- 将坐标系统保存为一个文件.prj
- MySQL修改数据表中的字段名_MySQL修改数据表中的字段名
- 【上班摸鱼系列】文字选择类游戏:《职员默示录 - 启》末日丧尸爆发,你,是什么下场!?...
- Pidgin 插件法解决Ubuntu11.10 QQ
- redis持久化机制,深入分析redisAOF和RDB模式的利弊
- 柴胡加龙骨牡蛎汤去大黄合当归芍药散治顽固心悸案(李跃海)
- p值>0.05,统计意义上不显著?
- apmserv mysql5.1启动失败_使用APMServ时出现“1、Apache启动失败,请检查相关配置。√MySQL5.1已启动。”错误的终极解决办法:...
- 微信开发之微信网页授权 完整示例
- 华为方舟编译器开源官网正式上线:源代码已开放下载;中兴通讯与北京交通大学、中国移动北京公司签署 “5G战略合作框架协议”……...
- 红米手机计算机的隐藏功能,红米手机按键隐藏神功能,米粉很多人都不全懂!...
- nvm 下载安装及相关命令
- c++ 孟岩推荐 书籍