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

你可能感兴趣的:(iOS 常见面试题-- isMemberOfClass 与 isKindOfClass 的区别)