Runtime

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

2017-02-26  本文已影响34人  Zafir_zzf

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

上一篇 下一篇

猜你喜欢

热点阅读