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