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)
最新文章
- HDU 5055 Bob and math problem(简单贪心)
- 相机位姿估计1_1:OpenCV:solvePnP二次封装与性能测试
- 怎么 才能显示Eclipse中Console的全部内容
- 8 个最佳 PHP 库
- jquery获取所有选中的checkbox的ID
- 黄聪:PHP5.6+7代码性能加速-开启Zend OPcache-优化CPU
- Spring中使用Hibernate
- MVC的Ajax的异步请求
- PHP数据库
- CloudFoundry Service 使用
- ajaxfileupload 实现多文件上传
- 把Wordpress集成到zen-cart里方法 各种修改 经典机制
- ASP.NET WebApi系列
- [Swift]LeetCode450. 删除二叉搜索树中的节点 | Delete Node in a BST
- SQLserver登陆报错
- idea相关
- 编码符_new88
- 浅谈MFC类CrackMe中消息处理函数查找方法
- laravel 使用构造器进行增删改查
- [转]最完美解决Nginx部署ThinkPHP项目的办法