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关键字(转)
通配符 在本文的前面的部分里已经说过了泛型类型的子类型的不相关性.但有些时候,我们希望能够像使用普通类型那样使用泛型类型: 向上造型一个泛型对象的引用 向下造型一个泛型对象的引用 向上造型一个泛型对象 ...
随机推荐
- spring工作机制及为什么要用?
spring工作机制及为什么要用?1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工作.2.DispatcherSer ...
- 【2018.11.22】CTSC2018(模拟赛!)
太蠢了……$noip$ 后第一次模拟赛竟然是这样的……完全就是打击自信 / 降智…… 1. 假面 一道神仙概率 $dp$!第一次写…… 拿到题就发现血量 $m_i$ 的上限只有 $100$! 然后 $ ...
- ArrayList构造函数有哪些
ArrayList 构造函数有(三种): public ArrayList(int initialCapacity) public ArrayList() public ArrayList(Colle ...
- Spring JdbcTemplate 查询方法中的RowMapper实现汇总
实现一.在内部建立内联类实现RowMapper接口 package hysteria.contact.dao.impl; import java.sql.ResultSet; import java. ...
- Vxlan简介
1.为什么需要Vxlan 1.什么是VXLAN VXLAN(Virtual eXtensible LAN可扩展虚拟局域网),是一种mac in UDP技术.传统的二层帧被封装到了UDP的报文中,通过U ...
- MySQL-JDBC Loadbalance深入解析
背景说明 公司的整个电商系统搭建在华为云上,根据老总的估计,上线3个月之后日订单量会达到百万级别,保守估计3个月之后总订单个数预计会有5千万.MySQL单表达到千万级别,就会出现明显的性能问题.根据如 ...
- nginx配置 location root alias
语法规则: location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可.nginx不对url做编码,因 ...
- htmlcxx取指定字段实例
#include <string> #include <iostream> #include <sstream> #include <htmlcxx/html ...
- BUPT复试专题—数据库检索(2014软院)
题目描述 在数据库的操作过程中,我们进场会遇到检索操作.这个题目的任务是完成一些特定格式的检索,并输出符合条件的数据库中的所有结果. 我们现在有一个数据库,维护了学生的姓名(Name),性别(Sex) ...
- 生活娱乐 VERYCD的T恤设计大赛
http://www.verycd.com/event/tee2011/ 购买网站: http://dianlv.taobao.com/