super究竟是个啥?
引子:
一直以为oc的super跟java中的super是一回事,没有去深究它的本质,直到工作的时候遇到一个并不能按我的理解能解释的情况。
剖析:
在此之前先看一段代码:
有两个类 SuperClass && SubClass ,SubClass继承SuperClass,SuperClass继承NSObject.
@implementation SubClass
- (id)init
{
self = [super init];
if (self) {
NSLog(@"%@",NSStringFromClass([super class]));
NSLog(@"%@",NSStringFromClass([self class]));
}
}
@end
如果你觉得两次打印出来的结果是不同的,那么我想你至少有一个看下去的理由,因为打印结果都是 SubClass
先写两个高大上的函数,对于C语言渣渣的我是这么觉得的:id objc_msgSend(id the Receiver, SEL theSelector,...) 和 id objc_msgSendSuper(struct objc_super *super, SEL theSelector, ...),其实这就是[self class] 和[super class]的真面目.
不妨反推一下:首先,我想在这一点我们肯定能达成共识:selector查询机制:首先查看Receiver的方法列表中查询,有就执行,没有就查找父类的方法列表,依次类推,一直到根类,直到找到为止。
我想告诉你我我并没有自己实现class这个类方法,根据以上的继承关系那么最后就肯定是在NSObject类中找到这个方法,然后发生了objc_msgSend(id the Receiver, SEL theSelector,...)这样的事情,由于结果是一样的,可知Receiver是同一个类。面对这种结果,你可能会想,super哪去了,为什么最后变成了同一个?
super是个啥?
先回过头去看一下两个高大上的函数,其实oc中所谓的消息机制,看到第二个函数的第一个参数了吗,struct objc_super *super好吧,原来super是个结构体指针,看一下里面是什么:
struct objc_super {
id receiver;
Class superClass;
};
原来super里面包含着一个receiver,还有一个该receiver的父类superClass,不难想象[super class]最后发生了objc_msgSend(objc_super->receiver, @selector(class))这样的事情,这也就解释了为什么结果会相同,那么结构体中superClass有什么用呢?当开始查询类函数列表时,[self class]是从当前类开始查,而[super class]则是从当前类的父类开始查,就这点不同。所有super的功能就是把函数列表的搜索起点从当前类换成了父类。
@mic
(Email:yrs2447426788@gmail.com)
(QQ:839720759)
super究竟是个啥?的更多相关文章
- 深入super,看Python如何解决钻石继承难题 【转】
原文地址 http://www.cnblogs.com/testview/p/4651198.html 1. Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通 ...
- 深入super,看Python如何解决钻石继承难题
1. Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通方法和super方法 假设Base是基类 class Base(object): def __init_ ...
- (转载)深入super,看Python如何解决钻石继承难题
1. Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通方法和super方法 假设Base是基类 class Base(object): def __init_ ...
- python的super深入了解(转)
1.python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通方法和super方法 假设Base是基类 class Base(object): def __init__(s ...
- Java基础之OOP
1. 类(类型)于对象 (1)面向过程的开发于面向对象开发的区别: 面向过程更重视流程化以及功能的开发,简单点来讲,就是按照固定的模式一步步按部就班的进行,最终达成一个功能的实现.这种模式叫做面向过程 ...
- ubuntu super daemon设置
super daemon是一个在Linux下面全面管理自己服务设置的东东,他可以接管很多服务的设定,只需要在/etc/xinetd.d/下面放置好自己的配置文件就可以了,那么,具体应该怎么配置呢? ...
- Java泛型中的? super T语法
? super T 语法将泛型类限制为所有T的超类(包括T自身),但只能用于参数中,不可以在返回值用加以限定.如果不加以限定,假设某个函数头为? super Manager get()由于编译器不知道 ...
- java泛型中的super和extend
List<? extend Fruit> list=new ArrayList<>(); 解释为:集合中元素是继承自Fruit,究竟是何种类型,编译器也无法判定. 如果要从集 ...
- 浅谈Java泛型中的extends和super关键字(转)
通配符 在本文的前面的部分里已经说过了泛型类型的子类型的不相关性.但有些时候,我们希望能够像使用普通类型那样使用泛型类型: 向上造型一个泛型对象的引用 向下造型一个泛型对象的引用 向上造型一个泛型对象 ...
随机推荐
- BZOJ 4004 [JLOI2015]装备购买 ——线性基
[题目分析] 题目很简单,就是要维护一个实数域上的线性基. 仿照异或空间的线性基的方法,排序之后每次加入一个数即可. 卡精度,开long double 和 1e-6就轻松水过了. [代码] #incl ...
- Spoj-BITDIFF Bit Difference
Given an integer array of N integers, find the sum of bit differences in all the pairs that can be f ...
- spring经典配置
1.annotation方式 <?xml version="1.0" encoding="UTF-8"?><beans xmlns=" ...
- Unslider--入门篇
Unslider--入门篇 背景:因工作需求,需要完成一个图片轮播效果,因博主不是专业的前端开发人员,so google之,经过挑选最终选择使用Unslider插件完成工作. 一.Unslider插件 ...
- python操作excel--生成图表
[问题] 想要折腾Python中的Excel中的图标,Chart,Graph. [解决过程] 1.参考: use python to generate graph in excel 说是可以用pywi ...
- .NET Core 3.0之创建基于Consul的Configuration扩展组件
写在前面 经过前面三篇关于.NET Core Configuration的文章之后,本篇文章主要讨论如何扩展一个Configuration组件出来.如果前面三篇文章没有看到,可以点击如下地址访问 .N ...
- BZOJ——1571: [Usaco2009 Open]滑雪课Ski
http://www.lydsy.com/JudgeOnline/problem.php?id=1571 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: ...
- BZOJ——1720: [Usaco2006 Jan]Corral the Cows 奶牛围栏
http://www.lydsy.com/JudgeOnline/problem.php?id=1720 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1 ...
- Atcoder Grand Contest 023
A 略 B 略 C(计数) 题意: 有n个白球排成一行,故有n-1个空隙,我可以给一个空隙对应的两个白球都涂黑.n-1个空隙的一个排列就对应着一个涂黑顺序,定义这个涂黑顺序的价值是“将所有n个球都涂黑 ...
- java中简单内存计算
今天面试遇到一个问题,假设一个类中只声明一个int类型,那么这个对象多大,这里先写出解决方案,首先引入内存计算工具lucene-core, <dependency> <groupId ...