一:举例说明
NSLog(@"[self class] = %@",[self class]);
NSLog(@"[self superclass] =%@",[self superclass]);
NSLog(@"-----------------------------------------------");
// [super class]底层实现是:
// object_messendSuper({self,[lzhPerson class]},@selector(class));
// 1.参数1:结构体对象 1.消息接收者2.从哪个类开始查找实现;是父类开始查找实现;
// 2.参数2:方法名
NSLog(@"[super class]= %@",[super class]);
NSLog(@"[super superclass] =%@",[super superclass]);
1.注意点:
所有class类都有 class方法,所以class方法在nsobject里面实现;不管self还是super调用都是调用的nsobject的class方法;
二: [super class]的底层实现
((void(*)(__rw_objc_super *, SEL))(void*)objc_msgSendSuper)((__rw_objc_super){(id)self, (id)class_getSuperclass(objc_getClass("Student"))}, sel_registerName("run"));
object_messendSuper({self,[lzhPerson class]},@selector(class));
1.参数1:结构体对象 1.消息接收者2.从哪个类开始查找实现;是父类开始查找实现;
2.参数2:方法名
2.1 声明一个结构体对象super对象;
struct objc_super {
__unsafe_unretained _Nonnull id receiver;//消息接收者
__unsafe_unretained _Nonnull Class class;//消息接收者的父类;指定方法的实现,从那个类开始搜索;
// class实际上就是传入的当前的类,在底层会调用objc_msgSendSuper2里面会 [viewcontroller class]->superClass再去获取父类的值;其实也是就是父类类型;
};
2.2 [super run];使用super对象调用函数底层实现如下:
struct__rw_objc_super args = {
self,
class_getSuperclass(objc_getClass("Student")),《==》[Person class];
sel_registerName("run")
};
objc_msgSendSuper(args,@selector("run"));
1.消息接收者仍然是子类对象;
2、从父类开始查找方法的实现;
3.由于class都是nsobjec的对象,所以查找的都是方法是一样的;消息接收者是self的对象子类的;所以打印为student的类;
sueprclass的原理等价于calss;
2.3、class函数的底层实现;
-(Class)class{
return objc_getClass(self);
}
-(Class)superclass{
return class_getSuperClass(objc_getClass(self));
}
注意:class返回的是self的类型;superclass返回的当前对象父类类型