美文网首页
isKindOfClass 和 isMemberOfClass

isKindOfClass 和 isMemberOfClass

作者: weixhe | 来源:发表于2020-09-21 15:44 被阅读0次

    这两个方法都有实例方法和类方法
    实例方法内部:调用者的类对象 == 传进去的 cls
    类方法内部:调用者的元类的对象 == 传进去的 cls

    源码:

    - (BOOL)isKindOfClass:(Class)cls {
        // 当前类对象 == cls 或 cls子类
        for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
            if (tcls == cls)
                return YES;
        }
        return NO;
    }
    
    - (BOOL)isMemberOfClass:(Class)cls {
        // 当前类对象 == cls
        return [self class] == cls
    }
    
    
    + (BOOL)isKindOfClass:(Class)cls {
        // 当前元类对象 == cls 或 cls子类
        for (Class tcls = object_getClass(self); tcls; tcls = tcls->superclass) {
            if (tcls == cls)
                return YES;
        }
        return NO;
    }
    
    + (BOOL)isMemberOfClass:(Class)cls {
        // 当前元类对象 == cls
        return object_getClass(self) == cls
    }
    

    即:

    [对象 isKindOfClass:类对象];
    [类对象 isKindOfClass:元类对象];
    
    [对象 isMemberOfClass:类对象];
    [类对象 isMemberOfClass:元类对象];
    
    但是,如果 [类对象 isKindOfClass:[NSObject class]]; == YES
    因为:子类的元类对象的 superclas->superclass->superclass ... 基类的类对象
    

    面试题

    1、以下两组代码的打印结果?

    BOOL re1 = [[NSObject class] isKindOfClass:[NSObject class]]; // YES
    BOOL re2 = [[NSObject class] isMemberOfClass:[NSObject class]]; // NO
    BOOL re3 = [[Person class] isKindOfClass:[Person class]]; // NO
    BOOL re4 = [[Person class] isMemberOfClass:[Person class]]; // NO
    
    BOOL re5 = [[NSObject alloc] isKindOfClass:[NSObject class]]; // YES
    BOOL re6 = [[NSObject alloc] isMemberOfClass:[NSObject class]]; // YES
    BOOL re7 = [[Person alloc] isKindOfClass:[Person class]]; // YES
    BOOL re8 = [[Person alloc] isMemberOfClass:[Person class]]; // YES
    

    相关文章

      网友评论

          本文标题:isKindOfClass 和 isMemberOfClass

          本文链接:https://www.haomeiwen.com/subject/awfvyktx.html