iOS:关于super 关键字的坑(从runtime来分析)

创建一个Person类,再创建一个继承与Person的SonPerson类.

在SonPerson中声明一个exercise方法打印[self class] [super class]

结果发现在子类中打印[self class]与[super class]结果是相同的,都是打印调用者的class名称..SonPerson.

我们知道self是类的隐藏参数,指向调用方法的这个类的实例.是一个指针.

而super跟self不一样,并不是指向父类的指针.是一个编译器修饰符.作用:

用self 调用方法是从此类的方法列表当中找对应方法调用..如果没有就从父类当中找;而super关键词是从父类的方法列表当中找,调用父类的那个方法..但是这两种方式,事件的调用者都是当前的实例SonPerson,最终都是找到了NSObject中的class的方法.

从runtime的底层API来看..调用[self class] 的时候是调用了objc_msgSend(self,@selector(class)),直接从当前实例里找class的实现

调用[super class]的时候是调用了objc_msgSendSuper(<#struct objc_super *super#>, <#SEL op, ...#>),里面传两个参数,

第一个参数objc_super结构体中有两个成员.

receiver就是调用这个事件的接受者.self    然后第二个就是父类的class,Person,然后从这个Person类开始找class方法,一直找到了NSObject,最后这两个方法都是调用了 [self class]

打印当前类的class.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,757评论 0 9
  • 战火熊熊近界燃,雄师百万戍边关。 旌旗猎猎狼心冷,号角声声狗肺寒。 利剑随身驱恶鬼,钢刀出手斩凶顽。 铜墙铁壁金瓯...
    艾思阅读 743评论 16 15
  • 这几天,经常有人过来咨询我一个问题,就是学习和工作时间如何安排,大神们的时间管理是如何做的。 其实,我自己不怎么会...
    水清亦有鱼阅读 333评论 1 17
  • 喂~到目前为止48小时,你没有联系过我。这个时间还会延续,直到你可能想起还有一个我。 我在跟你悄悄地玩一个游戏,真...
    晓天狼星阅读 267评论 0 2