Super

@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---

先寫個(gè)run方法 student繼承然后重寫,編譯為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方法是從父類的方法列表開始尋找.消息接收者還是self.而class的方法實(shí)現(xiàn)都是NSObject,查看源碼實(shí)現(xiàn):

- (Class)class{
    return object_getClass(self);
}

- (Class)superclass{
    return class_getSuperclass(object_getClass(self));
}

所有無論是[sefl class]還是[ super class],輸出的都是student;

ex: isKindOfClassisMemberOfClass

+ (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è)類對象,右邊遍歷基類,而基類的superclass 是指向類對象的.所以返回1.

[[NSObject class]isMemberOfClass:[NSObject class]]);
[[student class]isKindOfClass:[student class]])
[student class]isMemberOfClass:[student class]])

  • 類對象 != 基類
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容