一:舉例說明
? ? ? ? NSLog(@"[self class] = %@",[self class]);
? ? ? ? NSLog(@"[self superclass] =%@",[self superclass]);
? ? ? ? NSLog(@"-----------------------------------------------");
//? ? [super class]底層實現(xiàn)是:
//? ? ? object_messendSuper({self,[lzhPerson class]},@selector(class));
//? ? ? 1.參數(shù)1:結(jié)構(gòu)體對象? 1.消息接收者2.從哪個類開始查找實現(xiàn);是父類開始查找實現(xiàn);
//? ? ? ? 2.參數(shù)2:方法名
? ? ? ? NSLog(@"[super? class]= %@",[super? class]);
? ? ? ? NSLog(@"[super superclass] =%@",[super superclass]);
1.注意點:
所有class類都有 class方法,所以class方法在nsobject里面實現(xiàn);不管self還是super調(diào)用都是調(diào)用的nsobject的class方法;
二:?[super class]的底層實現(xiàn)
? ? ((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.參數(shù)1:結(jié)構(gòu)體對象? 1.消息接收者2.從哪個類開始查找實現(xiàn);是父類開始查找實現(xiàn);
?? ? ? ? 2.參數(shù)2:方法名
2.1 聲明一個結(jié)構(gòu)體對象super對象;
struct objc_super {
? ? __unsafe_unretained _Nonnull id receiver;//消息接收者
? ? __unsafe_unretained _Nonnull Class class;//消息接收者的父類;指定方法的實現(xiàn),從那個類開始搜索;
// class實際上就是傳入的當前的類,在底層會調(diào)用objc_msgSendSuper2里面會 [viewcontroller class]->superClass再去獲取父類的值;其實也是就是父類類型;
};
2.2 ?[super run];使用super對象調(diào)用函數(shù)底層實現(xiàn)如下:
?? struct__rw_objc_super args = {
? ? ? ? self,
? ? ? ? class_getSuperclass(objc_getClass("Student")),《==》[Person class];
? ? ? ? sel_registerName("run")
? ? };
?? ? objc_msgSendSuper(args,@selector("run"));
? ?1.消息接收者仍然是子類對象;
?? 2、從父類開始查找方法的實現(xiàn);
?? 3.由于class都是nsobjec的對象,所以查找的都是方法是一樣的;消息接收者是self的對象子類的;所以打印為student的類;
?? ? sueprclass的原理等價于calss;
2.3、class函數(shù)的底層實現(xiàn);
-(Class)class{
return? objc_getClass(self);
}
-(Class)superclass{
? return? class_getSuperClass(objc_getClass(self));
}
?注意:class返回的是self的類型;superclass返回的當前對象父類類型