理解isMemberOfClass,isKindOfClass,isSubclassOfClass,isAncestorOfObject

前言:
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他们对象方法表示的是判断的是类对象类方法判断是元类对象

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容