欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

iOS 面试题(iskindof)

程序员文章站 2022-04-14 22:53:22
...

这篇文章我们对面试题题目是这样的:

相关源码:

objc4_752源码

isa走位图:

iOS 面试题(iskindof)

 

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        BOOL re1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];
        BOOL re2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];
        BOOL re3 = [(id)[XZPerson class] isKindOfClass:[XZPerson class]];
        BOOL re4 = [(id)[XZPerson class] isMemberOfClass:[XZPerson class]];
        NSLog(@" \nre1 :%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)[XZPerson alloc] isKindOfClass:[XZPerson class]];
        BOOL re8 = [(id)[XZPerson alloc] isMemberOfClass:[XZPerson class]];
        NSLog(@" \nre5 :%hhd\n re6 :%hhd\n re7 :%hhd\n re8 :%hhd\n",re5,re6,re7,re8);

    }
    return 0;
}

问这个的输出结果:

首先这个我们需要分析,这个其实主要考察的就是

  1. 类方法 isKindOfClass主要判断什么
  2. 类方法isMemberOfClass主要判断什么
  3. 实例方法 isKindOfClass主要判断什么
  4. 实例方法isMemberOfClass主要判断什么

1.首先我们来看isKindOfClass类方法源码:

//    元类   VS  类
    for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}
//获取元类
Class object_getClass(id obj)
{
    if (obj) return obj->getIsa();
    else return Nil;
}

元类tcls和类cls进行对比,如果不匹配会循环元类的父类和类(元类的父类可以根据isa走位图进行查看)进行对比;(元类的父类,最终会找到NSObject)

可以得出: re1 = 1 ,re3 = 0;

2.继续分析isMemberOfClass类方法

+ (BOOL)isMemberOfClass:(Class)cls {
//     元类  VS  类
    return object_getClass((id)self) == cls;
}
/
Class object_getClass(id obj)
{
    if (obj) return obj->getIsa();
    else return Nil;
}

 

直接就是元类和类进行对比:这样我们可以得出:re2 = 0  re4 = 0

 

3.继续分析isKindOfClass实例方法

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

类和类以及类的父类进行循环判断我们可以得出re5 = 1 ;re7 =1;

 

4.继续分析isMemberOfClass实例方法

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

直接就是类和类进行对比,我们可以得出re6 =1 re8 =1

综上分析我们得出 re1 = 1 ,re2 = 0 re3 = 0 re4 = 0 re5 =1 re6 =1 re7 =1 re8 =1;

打印结果为:

iOS 面试题(iskindof)

 

和我们分析的是一样的;

我们可以继续拓展一下

        BOOL re9 = [(id)[NSObject class] isKindOfClass:[XZPerson class]];
        BOOL re10 = [(id)[NSObject class] isMemberOfClass:[XZPerson class]];
        BOOL re11 = [(id)[NSObject alloc] isKindOfClass:[XZPerson class]];
        BOOL re12 = [(id)[NSObject alloc] isKindOfClass:[XZPerson class]];

        NSLog(@" \nre5 :%hhd\n re6 :%hhd\n re7 :%hhd\n re8 :%hhd\n",re9,re10,re11,re12);

re9 ,re10,re11,re12 结果是什么呢?欢迎留言评论