iOS中[super class]为何会输出子类类型?
来源:互联网 发布:java数组如何调用方法 编辑:程序博客网 时间:2024/06/14 20:34
比如有一个自定义类DetailViewController
继承自类UIViewController
。那么我们对这个自定义类分别使用[self class]
和[super class]
将会分别输出如下结果:
1. 问题?
按照面向对象的思维, [super class] 应该会输出父类类型也就是UIViewController
,而从结果可以看到这两个输出都是一样的,那这是什么原因导致的呢?
我们知道实际上在iOS中,对方法的调用是通过发送消息来完成的。也就是说使用 [self class] 时,会使用obj_msgSend(id theReceiver, SEL selector, ...)函数向Receiver来发送消息。而使用 [super class] 时,会使用obj_msgsendSuper(...)函数向Receiver来发送消息。
2. 分析
1). 然而obj_msgSend(...)和obj_msgSendSuper(...)中Receiver都是self,这里的self也就是DetailViewController
2). [self class]和[super class]都会找到 NSObject中class方法
3). 当[super class]找到NSObject中的class方法以后,仍然会使用obj_msgSend(receiver, @selector(class))函数,因为receiver不变,所以输出的结果仍旧是DetailViewController
附
[super class]找到NSObject中class方法以后,reciever不变实际上是因为super只是一个“编译器指示符”,它和self指向的是相同的receiver。
- iOS中[super class]为何会输出子类类型?
- iOS中[super class]为何会输出子类类型?
- iOS中[super class]为何会输出子类类型?
- iOS中[super class]为何会输出子类类型?
- iOS 中子类重写父类方法的时候应该什么时候写在 super 之前 什么时候写在 super 之后
- Java中long类型为何会自动转换为float类型?(未整理)
- 在子类构造函数中使用super()
- java 中Object类里面的 getClass函数是final类型的, 为何子类调用, 结果确不同
- 坑【3】父类子类中关于super
- Java中子类的访问权限为何比父类大?
- Java中子类的访问权限为何比父类大?
- OC中为何要调super的方法
- 父类获取子类的class的类型
- Pymssql会截取text类型输出长度
- printf中输出类型
- java中Class类型(1)
- 数据库中,连接有哪些不同类型?请说明这些类型之间的差异,以及为何在某些情形下,某种连接会比较好。
- 为何Java Action中写Cookie会有延时呢?
- 关于sdk的点点滴滴
- Makefile 使用总结
- 全面介绍Windows内存管理机制及C++内存分配实例(六):堆栈
- maven3.5环境变量配置
- Hive中日期格式转换用法
- iOS中[super class]为何会输出子类类型?
- freeSWITCH + WebRTC 音视频会议
- 使用短信接口进行通知
- 正则表达式
- Java泛型的实现方法:类型擦除
- 【报表福利大放送】100余套报表模板免费下
- ios转场动画
- 经验分享:为什么你10年经验依旧平庸,他人却2年成就卓越?
- C#调用C++类