BOOL re1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];
//返回yes
+ (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = self->ISA(); tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
+ (Class)class {
return self;
}
上面為什么返回YES呢诡必?[NSObject class] 返回類對象NSObject奢方,NSObject調(diào)用isKindOfClass方法,首先是取到NSObject的元類與NSObject比較,不相等蟋字,然后取到NSObject元類的父類(NSObject元類的父類是NSObject)進行比較稿蹲,相等。
BOOL re2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];
+ (BOOL)isMemberOfClass:(Class)cls {
return self->ISA() == cls;
}
上面返回NO,為啥呢愉老?NSObject調(diào)用isMemberOfClass方法场绿,取的NSObject的元類與NSObject比較不相等
BOOL re3 = [(id)[LGPerson class] isKindOfClass:[LGPerson class]]; //
上面返回NO,為啥呢?[LGPerson class] LGPerson類對象嫉入,調(diào)用isKindOfClass 焰盗,首先取LGPerson的元類與LGPerson比較發(fā)現(xiàn)不相等,然后再取LGPerson元類的父類(NSObject的元類)與LGPerson比較咒林,也不相等熬拒,再取NSObject的元類的父類(NSObject)與LGPerson比較還不相等,再再然后取NSObject的父類位nil與LGPerson比較垫竞,也不相等澎粟,因為為nil所以跳出循環(huán),最后返回NO
BOOL re4 = [(id)[LGPerson class] isMemberOfClass:[LGPerson class]]; //
上面返回NO,為啥呢欢瞪?[LGPerson class] 返回LGPerson類對象活烙,再調(diào)用isMemberOfClass,會拿LGPerson類對象的isa即元類與LGPerson類對象比較遣鼓,所以不相等
BOOL re5 = [(id)[NSObject alloc] isKindOfClass:[NSObject class]];
- (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
- (Class)class {
return object_getClass(self);
}
Class object_getClass(id obj)
{
if (obj) return obj->getIsa();
else return Nil;
}
上面為什么返回YES呢啸盏?[NSObject alloc]一個NSObject的實例對象,調(diào)用isKindOfClass骑祟,該方法首先通過 [self class]拿到NSObject的類對象回懦,然后與傳過來的類對象進行比較,兩者相等
BOOL re6 = [(id)[NSObject alloc] isMemberOfClass:[NSObject class]];
- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}
NSObject的實例對象調(diào)用isMemberOfClass次企,該函數(shù)是拿實例對象的class即類對象與[NSObject class]比較怯晕,所以相等
BOOL re7 = [(id)[LGPerson alloc] isKindOfClass:[LGPerson class]];
BOOL re8 = [(id)[LGPerson alloc] isMemberOfClass:[LGPerson class]]; ```
//LGPerson的實例對象調(diào)用isMemberOfClass,該函數(shù)是拿實例對象的class即類對象與[LGPerson class]比較缸棵,所以相等