基础知识
+isKindOfClass 类方法是从当前类的isa指向(也就是当前类的元类)开始。沿着superclass继承链查找判断和对比类是否相等。
-isKindOfClass 对象方法从[self class](当前类)开始,沿着superclass继承链查找判断和对比类是否相等。
+is MemberOfClass 类方法直接判断当前类的isa指向(也就是当前类的元类)和对比类是否相等。
-isMwemberOfClass 对象方法是直接判断[self class](当前类)和对比类是否相等。
isKindOfClass和isMemberOfClass的区别
isKindOfClass来确定一个对象是否是一个类的实例,或者是该类祖先类的实例。
isMemberOfClass只能用来判断前者,不能用来判断后者。isKindOfClass能检测任何的类都是基于NSObject类这一事实,而isMemberOfClass却不可以。
第一列表示的是初始化对象(obj_object),这个对象里面有一个isa指针指向它所属的类,也就是图中的第二列;obj_class结构体里面存放的isa指针即指向了它的元类,也就是第三列;第三列的所有元类都指向了上帝类NSObject的元类(meta)。从图上上帝类NSObject的元类最后又指向了NSObject这个类本身,所以构成了一个回路。
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
//instacne-isKindOfClass
Person *person = [[Person alloc] init];
BOOL res1 = [[NSObject class] isKindOfClass:[NSObject class]];
BOOL res3 = [[Person class] isKindOfClass:[Person class]];
BOOL res10 = [[NSString class] isKindOfClass:[NSObject class]];
NSLog(@"%d %d %d",res1, res3, res10);
BOOL res5 = [[Person class] isKindOfClass:[NSObject class]];
BOOL res6 = [person isKindOfClass:[NSObject class]];
NSLog(@"%d %d", res5, res6);
//instance-isMemberOfClass
BOOL res2 = [[NSObject class] isMemberOfClass:[NSObject class]];
BOOL res7 = [person isMemberOfClass:[NSObject class]];
BOOL res8 = [[Person class] isMemberOfClass:[NSObject class]];
BOOL res9 = [person isMemberOfClass:[Person class]];
NSLog(@"%d %d %d %d" ,res2, res7, res8, res9);
}
return 0;
}
iskindofclass和ismemberofclass[77540:8188373] 1 0 1
iskindofclass和ismemberofclass[77540:8188373] 1 1
iskindofclass和ismemberofclass[77540:8188373] 0 0 0 1
res1从NSObject类的元类沿着superClass方向查找判断与NSObject类是否相等,NSObject的元类最后会指向NSObject类的本身与对比类相等,输出1。
res3从Person类的元类沿着superClass方向查找判断与Person类是否相等,从Person的元类到NSObject的元类再到NSObject类没有与对比类相等,输出0。
res10从NSString类的元类沿着superClass方向查找判断与NSObject类是否相等,从NSString的元类到NSObject的元类再到NSObject类,有与对比类相等。输出1。
res5从Person类的元类沿着superClass方向查找判断与NSObject类是否相等,从Person的元类到NSObject的元类再到NSObject类,有与对比类相等,输出1。
res6从person对象所属的Person类沿着superClass方向查找判断与NSObject类是否相等,从Person类到NSObject类有与对比类相等 ,输出1。
res2会判断NSObject类的元类与NSObject类是否相等,不相等输出0。
res7会判断person对象所属的Person类与NSObject类是否相等,不相等输出0。
res8会判断Person类的元类与NSObject类是否相等,不相等输出0。
res9会判断person对象所属的Person类与Person类是否相等,相等输出1。