isKindOfClass 和 isMemberOfClass
BOOL re1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];
BOOL re2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];
BOOL re3 = [(id)[Person class] isKindOfClass:[Person class]];
BOOL re4 = [(id)[Person class] isMemberOfClass:[Person class]];
NSLog(@" re1 :%hhd\n re2 :%hhd\n re3 :%hhd\n re4 :%hhd\n",re1,re2,re3,re4);
BOOL re5 = [(id)[NSObject alloc] isKindOfClass:[NSObject class]];
BOOL re6 = [(id)[NSObject alloc] isMemberOfClass:[NSObject class]];
BOOL re7 = [(id)[Person alloc] isKindOfClass:[Person class]];
BOOL re8 = [(id)[Person alloc] isMemberOfClass:[Person class]];
NSLog(@" re5 :%hhd\n re6 :%hhd\n re7 :%hhd\n re8 :%hhd\n",re5,re6,re7,re8);
从字面理解,isKindOfClass表示是否是某种类型的类,比如子类是否是父类的类型。
isMemberOfClass表示是否是某种类型的成员。
- (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
//----类方法开始----
+ (BOOL)isMemberOfClass:(Class)cls {
return object_getClass((id)self) == cls;
}
Class object_getClass(id obj)
{
if (obj) return obj->getIsa();
else return Nil;
}
//----类方法结束---
- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}
isKindOfClass底层是一个遍历,只要类的父类链中有当前的类,就会返回YES。
isMemberOfClass底层是获取类的Isa指针,通过指针中存放的信息来判定返回结果。
re1中,方法调用者为[NSObject class],参数相同,所以返YES。re2中,方法调用者为[NSObject class],参数相同,
至此,我们可以分析出上面代码的打印结果为:
re1 :1 re2 :0 re3 :0 re4 :0 re5 :1 re6 :1 re7 :1