zoukankan      html  css  js  c++  java
  • OC之runtime的(isKindOfClass和isMemberOfClass)

    写如下代码:

    BOOL flag1 = [[NSObject class] isKindOfClass:[NSObject class]];
    BOOL flag2 = [[NSObject class] isMemberOfClass:[NSObject class]];
    BOOL flag3 = [[LBPerson class] isKindOfClass:[LBPerson class]];
    BOOL flag4 = [[LBPerson class] isMemberOfClass:[LBPerson class]];
    NSLog(@"%d %d %d %d", flag1, flag2, flag3, flag4);

    打印结果如下:

    1 0 0 0

    在objc中拿到isKindOfClass和isMemberOfClass的实现代码如下:

    + (BOOL)isMemberOfClass:(Class)cls {
        return self->ISA() == cls;
    }
    
    - (BOOL)isMemberOfClass:(Class)cls {
        return [self class] == cls;
    }
    
    + (BOOL)isKindOfClass:(Class)cls {
        for (Class tcls = self->ISA(); 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;
    }

    观察源码可以看出,isMemeberOfClass类方法取的的消息接收者的父类与后者相比较,是否相等

    isKindOfClass类方法会取消息接受者的父类,直到取到NSObject比较,判断的是消息接收者的父类是不是后者的父类或者元类,到NSObject结束

    同样的是两者的对象方法取得是接受者的类对象相比较

  • 相关阅读:
    [NOIP模拟赛][贪心]奶牛晒衣服.
    BZOJ3750: [POI2015]Piecz
    BZOJ2348 [Baltic 2011]Plagiarism
    高精度乘法【高乘高
    codevs 1215 迷宫
    变量交换
    a+b问题与圆柱体表面积的计算
    算数表达式的练习
    [bzoj1070][SCOI2007]修车[ 网络流]
    [bzoj2502]清理雪道[上下界网络流]
  • 原文地址:https://www.cnblogs.com/muzichenyu/p/14203831.html
Copyright © 2011-2022 走看看