iOS 面试题(iskindof)

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

相关源码:

objc4_752源码

isa走位图:

 

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;

打印结果为:

 

和我们分析的是一样的;

我们可以继续拓展一下

        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 结果是什么呢?欢迎留言评论

欢迎大家点赞,关注我的CSDN,我会定期做一些技术分享!

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值