@interface person : NSObject
@end
@interface student : person
@end
@implementation student
- (instancetype)init
{
self = [super init];
if (self) {
NSLog(@"%@---\n",[self class]);
NSLog(@"%@---\n",[self superclass]);
NSLog(@"%@---\n",[super class]);
NSLog(@"%@---\n",[super superclass]);
}
return self;
}
@end
Super[2393:41718] student---
Super[2393:41718] person---
Super[2393:41718] student---
Super[2393:41718] person---
先寫(xiě)個(gè)run方法 student繼承然后重寫(xiě),編譯為c++文件.
- (void)run{
[super run];
((void (*)(__rw_objc_super *, SEL))(void *)objc_msgSendSuper)((__rw_objc_super){(id)self, (id)class_getSuperclass(objc_getClass("student"))}, sel_registerName("run"));
}
super 被轉(zhuǎn)換成 objc_msgSendSuper
,里面包含了一個(gè)objc_super
的結(jié)構(gòu)體.
/// Specifies the superclass of an instance.
struct objc_super {
__unsafe_unretained _Nonnull id receiver;
__unsafe_unretained _Nonnull Class super_class;
};
/**
* Sends a message with a simple return value to the superclass of an instance of a class.
*
* @param super A pointer to an \c objc_super data structure. Pass values identifying the
* context the message was sent to, including the instance of the class that is to receive the
* message and the superclass at which to start searching for the method implementation.
* @param op A pointer of type SEL. Pass the selector of the method that will handle the message.
* @param ...
* A variable argument list containing the arguments to the method.
*
* @return The return value of the method identified by \e op.
*
* @see objc_msgSend
*/
OBJC_EXPORT id _Nullable
objc_msgSendSuper(struct objc_super * _Nonnull super, SEL _Nonnull op, ...)
OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);
objc_super
有2個(gè)成員,一個(gè)是消息接收者,一個(gè)父類, objc_msgSendSuper
方法是從父類的方法列表開(kāi)始尋找.消息接收者還是self
.而class
的方法實(shí)現(xiàn)都是NSObject
,查看源碼實(shí)現(xiàn):
- (Class)class{
return object_getClass(self);
}
- (Class)superclass{
return class_getSuperclass(object_getClass(self));
}
所有無(wú)論是[sefl class]
還是[ super class]
,輸出的都是student
;
ex: isKindOfClass
和 isMemberOfClass
+ (Class)class {
return self;
}
- (Class)class {
return object_getClass(self);
}
+ (Class)superclass {
return self->superclass;
}
- (Class)superclass {
return [self class]->superclass;
}
+ (BOOL)isMemberOfClass:(Class)cls {
return object_getClass((id)self) == cls;
}
- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}
+ (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
- (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
NSLog(@"%d----\n",[[NSObject class]isKindOfClass:[NSObject class]]);
NSLog(@"%d----\n",[[NSObject class]isMemberOfClass:[NSObject class]]);
NSLog(@"%d----\n",[[student class]isKindOfClass:[student class]]);
NSLog(@"%d----\n",[[student class]isMemberOfClass:[student class]]);
[NSObject class]isKindOfClass:[NSObject class]]
- 左邊返回一個(gè)類對(duì)象,右邊遍歷基類,而基類的superclass 是指向類對(duì)象的.所以返回1.
[[NSObject class]isMemberOfClass:[NSObject class]]);
[[student class]isKindOfClass:[student class]])
[student class]isMemberOfClass:[student class]])
- 類對(duì)象 != 基類