iOS 进阶笔记(七)7.2 isMemberOfClass和isKindOfClass分析
#pragma mark- 😁😁😁😁😁😁 isMemberOfClass
+ (BOOL)isMemberOfClass:(Class)cls {
// 判断当前类对象的isa(即元类对象)是否与cls相等,要求cls为元类对象(通过object_getClass(类对象))
return self->ISA() == cls;
}
- (BOOL)isMemberOfClass:(Class)cls {
// 判断当instance的类对象是否与cls相等,要求cls为类对象
return [self class] == cls;
}
#pragma mark- 😁😁😁😁😁😁 isKindOfClass
+ (BOOL)isKindOfClass:(Class)cls {
// self->ISA()指向方法调用者类对象(如Person对象)的元类对象
// 1、若当前类对象的元类对象tcls = cls, 返回YES
// 2、否则,向上查找tcls父类再与cls比较看是否相等,若第一层父类相等则返回YES
// 3、否则,则继续向上查找,直到找到NSObject元类对象,NSObject元类对象的superClass指向了NSOject类对象本身
for (Class tcls = self->ISA(); tcls; tcls = tcls->getSuperclass()) {
if (tcls == cls) return YES;
}
return NO;
}
- (BOOL)isKindOfClass:(Class)cls {
// 1、令当前tcls = 当前实例对象的类对象;
// 2、当cls等于当前实例对象的类对象时,放回YES
// 3、否则,判断当前tcls是否等于nil,若为nil,退出循环,并返回NO
// 4、若tcls不等于nil,则查找tcls的父类对象
// 5、若tcls的上一层父类对象,tcls_1 == cls,则返回YES,否则,继续查找tcls的父类
// 6、若cls是继承自NSObject(或cls为NSObject),则一定可以找到类对象tcls_n与cls相等
for (Class tcls = [self class]; tcls; tcls = tcls->getSuperclass()) {
if (tcls == cls) return YES;
}
return NO;
}
(限于水平,本文可能存在瑕疵甚至错误的地方。如有发现,还请留言指正,相互学习。thx! )
KEEP LOOKING, DON`T SETTLE!