Person
继承自NSObject
, main
函数中代码以下isKindOfClass:
和isMemberOfClass:
两个方法, 底层代码是开源的- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}
复制代码
self
的类方法, 与传入的Class
进行对比, 若是相同返回YES
, 不然返回NO- (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
复制代码
[self class]
与传入cls
对比,
[[self class] supperclass]
与cls
对比YES
, 若是最后也没有匹配成功就会返回NO
+ (BOOL)isMemberOfClass:(Class)cls {
return object_getClass((id)self) == cls;
}
复制代码
self
的元类对象
与传入的cls
进行对比, 若是相同返回YES
, 不然返回NO
+ (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
复制代码
self
的元类对象
与传入的cls
进行对比
YES
object_getClass(self)->superclass
与cls
对比, 依次类推YES
, 若是最后也没有匹配成功就会返回NO
1
// [NSObject class] == [NSObject class]
NSLog(@"%d", [[Person class] isKindOfClass:[NSObject class]]);
// [NSObject class] == [NSObject class]
NSLog(@"%d", [[NSObject class] isKindOfClass:[NSObject class]]);
复制代码
cls
参数都是[NSObject class]
那么为何, 这两句代码的结果相等呢?面试
superclass
查找父类的过程当中, 若是是经过元类对象
查找, 根类NSObject元类对象
的superclass
是[NSObject class]
元类
的superclass
, 最终都会找到[NSOject class]
, 因此上面两句代码的结果是相等的总结:
只要是isKindOfClass:
方法的cls
参数是[NSObject class]
, 那么调用者只要是NSObject
或者NSObject
的子类, 那么结果都是YESbash
// 元类对象最后会经过`superclass`找到[NSObject class], 因此结果相等, 结果是1
NSLog(@"%d", [NSObject isKindOfClass:[NSObject class]]);
// objc_getClass([NSObject class]) != [NSObject class] 结果是0
NSLog(@"%d", [NSObject isMemberOfClass:[NSObject class]]);
// objc_getClass([Person class]) != [Person class] 结果是0
NSLog(@"%d", [Person isKindOfClass:[Person class]]);
// objc_getClass([Person class]) != [Person class] 结果是0
NSLog(@"%d", [Person isMemberOfClass:[Person class]]);
复制代码