再看一眼class方法

来做几道面试题



第一题:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容