看一下这两个方法的实现源码就清楚了:
+ (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;
}
有下面几点需要注意:
-
isMemberOfClass:(Class)cls
必须与参数是同一类对象才返回YES。 -
-
开头的方法比较的是类对象;+
开头的方法比较的是元类对象(metaClass)。 - (CZPerson继承自NSObject)
[CZPerson isKindOfClass:[CZPerson class]]
;
该方法的返回值为NO,原因是传递的参数是类对象不是元类对象。
然而!!!
[CZPerson isKindOfClass:[NSObject class]]
返回值为YES!原因是,当CZPerson的元类对象沿着superClass指针向上找到NSObject元类对象时,因为NSObject元类对象的superClass指针指向NSObject类对象,因此,返回YES。参见下图:
Screen Shot 2018-06-01 at 22.30.07.png
网友评论