iOS 常见面试题-- isMemberOfClass 与 isKindOfClass 的区别

一、isMemberOfClass

底层实现代码如下:

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

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

由底层代码可知 只有我们传入的对象类型 等于所比较的对象类型 才会返回YES 否则返回NO

二、isKindOfClass
底层实现代码如下:

对象方法
- (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}


类方法
+ (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}

由底层代码可知 只有我们传入的对象类型与所比较的对象类型相同 或则与所比较对象的子类相同 才会返回YES 否则返回NO

总结 :
例如:【A isMemberOfClass B】

只有 A的类型 等于 B的类型才会返回YES

【A isKindOfClass B】

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

推荐阅读更多精彩内容