美文网首页
探索 isKindOf 与isMemberOf

探索 isKindOf 与isMemberOf

作者: _涼城 | 来源:发表于2020-09-19 10:42 被阅读0次

    isKindOfisMemberOf

    问:最终输出的结果是什么?
    BOOL re1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];       //
    BOOL re2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];     //
    BOOL re3 = [(id)[Person class] isKindOfClass:[Person class]];       //
    BOOL re4 = [(id)[Person class] isMemberOfClass:[Person class]];     //
    NSLog(@" re1 :%hhd\n re2 :%hhd\n re3 :%hhd\n re4 :%hhd\n",re1,re2,re3,re4);
    
    BOOL re5 = [(id)[NSObject alloc] isKindOfClass:[NSObject class]];       //
    BOOL re6 = [(id)[NSObject alloc] isMemberOfClass:[NSObject class]];     //
    BOOL re7 = [(id)[Person alloc] isKindOfClass:[Person class]];       //
    BOOL re8 = [(id)[Person alloc] isMemberOfClass:[Person class]];     //
    NSLog(@" re5 :%hhd\n re6 :%hhd\n re7 :%hhd\n re8 :%hhd\n",re5,re6,re7,re8);
    
    isKindOfClass

    打开objc源码查看

    类方法

    当前类的元类(父元类,根元类,根类)是否与cls相等

    + (BOOL)isKindOfClass:(Class)cls {
        for (Class tcls = self->ISA(); tcls; tcls = tcls->superclass) {
            if (tcls == cls) return YES;
        }
        return NO;
    }
    
    实例方法

    判断当前类(父类、根类)是否与cls相等

    - (BOOL)isKindOfClass:(Class)cls {
        for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
            if (tcls == cls) return YES;
        }
        return NO;
    }
    
    底层实现

    类似于alloc方法,isKindOfClass直接调用到了objc_opt_isKindOfClass

    BOOL
    objc_opt_isKindOfClass(id obj, Class otherClass)
    {
    #if __OBJC2__
        if (slowpath(!obj)) return NO;
        Class cls = obj->getIsa();
        if (fastpath(!cls->hasCustomCore())) {
            for (Class tcls = cls; tcls; tcls = tcls->superclass) {
                if (tcls == otherClass) return YES;
            }
            return NO;
        }
    #endif
        return ((BOOL(*)(id, SEL, Class))objc_msgSend)(obj, @selector(isKindOfClass:), otherClass);
    }
    
    isMemberOfClass
    类方法

    判断当前的元类是否与cls相等

    + (BOOL)isMemberOfClass:(Class)cls {
        return self->ISA() == cls;
    }
    
    实例方法

    判断当前类是否与cls相等

    - (BOOL)isMemberOfClass:(Class)cls {
        return [self class] == cls;
    }
    
    结果
    re1 :1
    re2 :0
    re3 :0
    re4 :0
    
    re5 :1
    re6 :1
    re7 :1
    re8 :1
    

    相关文章

      网友评论

          本文标题:探索 isKindOf 与isMemberOf

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