美文网首页Runtime
iOS:关于super 关键字的坑(从runtime来分析)

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

作者: Zafir_zzf | 来源:发表于2017-02-26 14:40 被阅读34次

    创建一个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.

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/fppowttx.html