引子:

   一直以为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)

最新文章

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

热门文章

  1. bzoj1063【Noi2008】道路设计
  2. eclipse中AXIS2发布过程
  3. BZOJ3295 动态逆序对(树状数组套线段树)
  4. angular实时显示checkbox被选中的元素
  5. VM虚拟机
  6. Idea基本讲解、常用配置以及快捷键设置
  7. Codeforces 757 F Team Rocket Rises Again
  8. 洛谷 P1710 地铁涨价
  9. Java并发编程,深入理解ReentrantLock
  10. python type