美文网首页
Runtime3 - isKindOfClass、isMembe

Runtime3 - isKindOfClass、isMembe

作者: Jean_Lina | 来源:发表于2020-09-15 20:40 被阅读0次

    OC的反射机制:反射最主要的目的是解耦。
    isMemberOfClass:判断是否是某一个类
    isKindOfClass:判断是否是某一个类或者该类的子类

    类对象的比较:
    //获取类对象
    - (Class)class {
        return object_getClass(self);
    }
    //获取父类对象
    - (Class)superclass {
        return [self class]->superclass;
    }
    //当前实例的类对象等于传入的类对象
    - (BOOL)isMemberOfClass:(Class)cls {
        return [self class] == cls;
    }
    //当前实例的类对象等于传入的类对象/或者当前实例的父类对象等于传入的类对象
    - (BOOL)isKindOfClass:(Class)cls {
        for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
            if (tcls == cls) return YES;
        }
        return NO;
    }
    
    元类对象的比较:
    + (Class)class {
        return self;
    }
    + (Class)superclass {
        return self->superclass;
    }
    + (BOOL)isMemberOfClass:(Class)cls {
        return self->ISA() == cls;
    }
    + (BOOL)isKindOfClass:(Class)cls {
        for (Class tcls = self->ISA(); tcls; tcls = tcls->superclass) {
            if (tcls == cls) return YES;
        }
        return NO;
    }
    
    
    实例1:
        - (void)question1 {
        //NSObject基类的元类对象的superclass是NSObject基类的类对象
        BOOL result1 = [[NSObject class] isKindOfClass:[NSObject class]];   //YES
        BOOL result2 = [[NSObject class] isMemberOfClass:[NSObject class]]; //NO
        BOOL result3 = [[Person class] isKindOfClass:[Person class]];      //NO
        BOOL result4 = [[Person class] isMemberOfClass:[Person class]];    //NO
        NSLog(@"result1 = %d", result1); //1
        NSLog(@"result2 = %d", result2); //0
    
        NSLog(@"result3 = %d", result3); //0
        NSLog(@"result4 = %d", result4); //0
        
        Person *person = [[Person alloc] init];
        NSLog(@"结果1:%d", [person isMemberOfClass:[Person class]]);   //1
        NSLog(@"结果2:%d", [person isMemberOfClass:[NSObject class]]); //0
        NSLog(@"结果3:%d", [person isKindOfClass:[Person class]]);    //1
        NSLog(@"结果4:%d", [person isKindOfClass:[NSObject class]]);  //1
    }
    

    相关文章

      网友评论

          本文标题:Runtime3 - isKindOfClass、isMembe

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