来做几道面试题
第一题:
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。
(╥﹏╥)
网友评论