iOS isKindOfClass& isMemberOfClass面试题

首先看一段代码

BOOL re1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];       //
BOOL re2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];     //
BOOL re3 = [(id)[LGPerson class] isKindOfClass:[LGPerson class]];       //
BOOL re4 = [(id)[LGPerson class] isMemberOfClass:[LGPerson 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)[LGPerson alloc] isKindOfClass:[LGPerson class]];       //
BOOL re8 = [(id)[LGPerson alloc] isMemberOfClass:[LGPerson class]];     //
NSLog(@" re5 :%hhd\n re6 :%hhd\n re7 :%hhd\n re8 :%hhd\n",re5,re6,re7,re8);

来我们看下输出结果


image.png

原理分析

看下isKindOfClass的类方法&实例方法实现

+ (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = self->ISA(); tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}

- (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}

isMemberOfClass的类方法&实例方法实现

+ (BOOL)isMemberOfClass:(Class)cls {
    return self->ISA() == cls;
}

- (BOOL)isMemberOfClass:(Class)cls {
    return [self class] == cls;
}

然后我们再看一张非常漂亮的isa走位图

isa流程图.png

从图中看出一下几点

  • 跟元类的isa指向了自己
  • NSObjectsuperclass为空 (循环出口)
  • 跟元类的superclass指向了NSObject

结果分析

  • result1 :1 NSObjectNSObject类方法对比
    1.NSObjectNSObject的元类即跟元类 不相等
    2.NSObject 与 根元类的父类即根类 相等,返回1

  • result2 :0 NSObjectNSObject类方法对比

    1. NSObjectNSObject的元类即根元类 不相等
  • result3 :0 LGPersonLGPerson类方法对比
    1.LGPersonLGPerson的元类即元类LGPerson 不相等
    2.LGPerson 与 元类LGPerson的父类即根元类 不相等
    3.LGPerson根元类的父类即根类 不相等
    4.LGPerson根类的父类即 nil 不相等

  • result4 :0 LGPersonLGPerson类方法对比
    1.LGPerson元类 不相等

  • result5 :1 NSObjectNSObject实例方法对比
    1.NSObject 与 对象的isaNSObject根类 相等

  • result6 :1 NSObjectNSObject类方法对比
    1.NSObject 与 对象的类即NSObject根类 相等

  • result7 :1 LGPersonLGPerson类方法对比
    1.LGPerson 与 对象的isaLGPerson 相等

  • result8 :1 LGPersonLGPerson类方法对比
    1.LGPerson 与 对象的类即LGPerson 相等

你可能感兴趣的:(iOS isKindOfClass& isMemberOfClass面试题)