美文网首页
理解isMemberOfClass,isKindOfClass,

理解isMemberOfClass,isKindOfClass,

作者: 熊啊熊啊熊 | 来源:发表于2019-08-27 09:48 被阅读0次

前言:
NSObject很多源码是公开的,可以下载源码查看一些方法的实现

废话不多说,直接上源码:

+ (BOOL)isMemberOfClass:(Class)cls {
    return object_getClass((id)self) == cls;
}

- (BOOL)isMemberOfClass:(Class)cls {
    return [self class] == cls;
}

+ (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = object_getClass((id)self); 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;
}

+ (BOOL)isSubclassOfClass:(Class)cls {
    for (Class tcls = self; tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}

+ (BOOL)isAncestorOfObject:(NSObject *)obj {
    for (Class tcls = [obj class]; tcls; tcls = tcls->superclass) {
        if (tcls == self) return YES;
    }
    return NO;
}

我们可以发现isMemberOfClass,isKindOfClass的区别
1.首先来看这两个的对象方法实现:

//是直接判断该对象的类对象跟传参进来的类对象比较
- (BOOL)isMemberOfClass:(Class)cls {
    return [self class] == cls;
}

// 可以看到在实现,用了一个for循环,这方法表示该对象的类对象是否是传参进来类对象的子类
- (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}

2.这两个的类方法实现:
object_getClass这个函数是如果传入的是实例对象则返回的是类对象,如果传入的是类对象则返回的是该类的元类对象

//是直接判断该类对象跟传参进来的元类对象比较
+ (BOOL)isMemberOfClass:(Class)cls {
    return object_getClass((id)self) == cls;
}

// 可以看到在实现,用了一个for循环,这方法表示该对象的元类对象是否是传参进来元类对象的子类
+ (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}

总结: isMemberOfClass isKindOfClass他们对象方法表示的是判断的是类对象类方法判断是元类对象

相关文章

网友评论

      本文标题:理解isMemberOfClass,isKindOfClass,

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