理解isMemberOfClass,isKindOfClass,

2019-08-27  本文已影响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他们对象方法表示的是判断的是类对象类方法判断是元类对象

上一篇 下一篇

猜你喜欢

热点阅读