美文网首页
再看一眼class方法

再看一眼class方法

作者: 卖萌凉 | 来源:发表于2016-07-26 22:07 被阅读175次

    来做几道面试题



    第一题:

    MyObject *myObject = [[MyObject alloc] init];
    Class clazz1 = [myObject class];

    请问```clazz1```指的是?
    
    >A. MyObject类
    B. MyObject的元类
    
    
    第二题:
    
    >```
    Class clazz2 = [MyObject class];
    

    请问clazz2指的是?

    A. MyObject类
    B. MyObject的元类

    我当时的回答:
    第一题:我猜class方法肯定是获取了对象的isa指针,所以选择了A。
    第二题:我猜class方法肯定是获取了对象的isa指针,所以选择了B。

    然后面试官说:那你平时用isKindOfClass:这个方法的时候,传的参数都是什么样的呢?

    我一想,诶,平时用isKindOfClass:的时候,我一般都这样写:

    [myObject isKindOfClass:[MyObject class]];
    

    如果第二题的答案是B的话,用这种方式来判断myObject的类型,肯定得到的是错误的答案。

    ???懵逼中……


    解答



    查看了一下NSObject的头文件,其实可以看到,NSObject分别有

    - (Class)class;
    

    + (Class)class;
    

    两个class方法,分别为实例方法和类方法。

    这两个方法都是怎么实现的呢?其实通过开源的runtime源码可以看到这两个方法的具体实现:

    + (Class)class {
        return self;
    }
    
    - (Class)class {
        return object_getClass(self);
    }
    

    可以看到,+class方法直接返回类自身,而-class方法返回isa指针指向的对象,也就是这个对象所对应的类。

    所以这两道题都应该选择A。

    (╥﹏╥)


    参考

    objc4-680

    相关文章

      网友评论

          本文标题:再看一眼class方法

          本文链接:https://www.haomeiwen.com/subject/vhwnjttx.html