码迷,mamicode.com
首页 > 其他好文 > 详细

super究竟是个啥?

时间:2014-07-10 16:32:25      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:style   blog   java   color   strong   io   

引子:

   一直以为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究竟是个啥?,布布扣,bubuko.com

super究竟是个啥?

标签:style   blog   java   color   strong   io   

原文地址:http://www.cnblogs.com/tml839720759/p/3834800.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!