/// 类方法,返回自身
+ (Class)class {
return self;
}
/// 实例方法,查找isa(此处返回类对象或者元类对象)
- (Class)class {
return object_getClass(self);
}
Class object_getClass(id obj){
if (obj) return obj->getIsa();
else return Nil;
}
inline Class objc_object::getIsa(){
if (isTaggedPointer()) {
uintptr_t slot = ((uintptr_t)this >> TAG_SLOT_SHIFT) & TAG_SLOT_MASK;
return objc_tag_classes[slot];
}
return ISA();
}
inline Class objc_object::ISA(){
assert(!isTaggedPointer());
return (Class)(isa.bits & ISA_MASK);
}
// 当前类对象的ISA :元类 然后元类的:superclass 即判断cls 是不是当前类的元类或者元类的父类
+ (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = self->ISA(); tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
// 当前实例对象的类对象 然后类对象的:superclass 即判断cls 是不是当前对象的的类对象或者类对象的父类
- (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
/// cls是不是当前类的元类对象
+ (BOOL)isMemberOfClass:(Class)cls {
return self->ISA() == cls;
}
/// cls是不是当前类的类对象
- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}
![](https://img2020.cnblogs.com/blog/410221/202011/410221-20201124002144809-583228601.png)
- (void)testClassISA {
id b1 = [NSObject class];
id b2 = [NSObject class];
id b3 = [[NSObject new] class];
NSLog(@"[NSObject class] = %@ , %@, %@", b1,b2,b3);
// true
/*
self = (id)[NSObject class] 类方法 返回自身
cls = [NSObject class] 类方法 返回自身
【self isKindOfClass:cls】 即cls是不是self的元类或者元类的父类
元类的基类是NSObject NSObject元类对象的父类是 NSObject类对象 所以为true
*/
BOOL res1 = [(id)[NSObject class] isKindOfClass:(id)[NSObject class]];
// false + (BOOL)isMemberOfClass:(Class)cls cls 是不是self的元类对象 ?
//后面的(id)[NSObject class] 即 cls此时是类对象 而不是元类对象 故返回false
/*
self = (id)[NSObject class] 类方法 返回自身 类对象
cls = [NSObject class] 类方法 返回自身 类对象
【self isMemberOfClass:cls】 即求:cls是不是self的元类对象
类对象 不等于 元类对象 false
*/
BOOL res2 = [(id)[NSObject class] isMemberOfClass:(id)[NSObject class]];
// true cls是不是self的元类对象或者元类对象的父类
/*
a = [[NSObject new] class] 类对象
b = [NSObject class] 类对象
[a isKindOfClass:b】 b是不是a的元类类对象或者元类类对象的父类 true
*/
BOOL res3 = [(id)[[NSObject new] class] isKindOfClass:(id)[NSObject class]];
// false + (BOOL)isMemberOfClass:(Class)cls cls是不是self的类对象
/*
a = [[NSObject new] class] 类对象
b = [NSObject class] 类对象
[a isMemberOfClass:b】 b是不是a的元类对象 false
*/
BOOL res4 = [(id)[[NSObject new] class] isMemberOfClass:(id)[NSObject class]];
// true
/*
a = [[NSObject new] class] 类对象
b = [NSObject class] 类对象
[a isKindOfClass:b】 b是不是a的元类对象 或者元类对象的父类
*/
BOOL res5 = [(id)[[NSObject new] class] isKindOfClass:(id)[NSObject class]];
// false
/*
a = [[NSObject new] class] 类对象
b = [NSObject class] 类对象
[a isMemberOfClass:b】 b是不是a的元类对象
*/
BOOL res6 = [(id)[[NSObject new] class] isMemberOfClass:(id)[NSObject class]];
// false (id)[Test class] 是不是[(id)[Test class]的元类对象 或者它父类的元类对象
BOOL res7 = [(id)[Test class] isKindOfClass:(id)[Test class]];
// false (id)[Test class] 是不是[(id)[Test class]的元类对象
BOOL res8 = [(id)[Test class] isMemberof:(id)[Test class]];
// false (id)[Test class] 是不是[(id)[Test class]的元类对象 或者它父类的元类对象
BOOL res9 = [(id)[[Test new] class] isKindOfClass:(id)[Test class]];
// false (id)[Test class] 是不是[(id)[Test class]的元类对象
BOOL res10 = [(id)[[Test new] class] isMemberOfClass:(id)[Test class]];
// true [Test class]是不是[Test new]的类对象 或者类对象的父类
BOOL res11 = [(id)[Test new] isKindOfClass:(id)[Test class]];
// true [Test class]是不是[Test new]的类对象
BOOL res12 = [(id)[Test new] isMemberOfClass:(id)[Test class]];
// 1, 0, 1, 0, 1, 1
NSLog(@"%d, %d, %d, %d, %d, %d",res1, res2, res3,res4,res5, res6);
// 0, 0, 0, 0, 1, 1
NSLog(@"%d, %d, %d, %d, %d, %d",res7, res8, res9,res10,res11, res12);
}