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结束

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

  • 相关阅读:
    idea+maven使用
    MySQL数据库一个字段对应多个值得模糊查询
    什么时候用接口?什么时候用抽象类?
    线程的死锁和死锁解决的实际案例
    idea 实用插件
    linux查看日志报错
    mysql日期模糊查找的方法
    mysql 日期函数
    win10安装sonarqube
    docker中mysql数据库导出部分数据
  • 原文地址:https://www.cnblogs.com/muzichenyu/p/14203831.html
Copyright © 2011-2022 走看看