(面试)[self class] [self superclass] [super class] [super supclass]

488 阅读1分钟

这里我先说结论:

[self class] 返回的肯定是方法调动者 [self superclass] 返回的肯定是receiver 的父类 [super class] 返回的肯定是方法调动者 [super superclass] 返回的肯定是receiver 的父类

[super class] 返回的依然是receiver;为什么呢?看底层实现会发现,super 首先会调用,不会再同坐ISA指针去找,直接去调用super 会拿到super的方法列表,然后去调用class方法,class方法的具体实现在NSObject里面,因为源码看不到,通过猜想,验证后,发现其实 就是

-(Class)class{
  reture [objc_getClass(self)];
}

这样就能发现,其实返回的是self ,也就是receiver

super的底层实现又是什么呢?clang readwrite 查看源码会发现。其实就是一个结构体里面实现:

struct objc_super{
__unsafe_unretained _Nonnull id receiver;//消息接受者
__unsafe_unretained _Nonnull Class super_class;//消息接受者的父类
}

解释只有前三个问题已经解决,最后一个[super superclass]呢? 其实可以这样写

-(Class)superclass{
  reture [class_getSuperclass(objc_getClass(self)];
}
(objc_getClass(self)返回的是receiver
class_getSuperclass(receiver)返回的就是: receiver的父类

调用结果对不如下

基本操作符号 返回结果
[self class] receiver(调用者)
[self superclass] 返回receiver的父类(调用者的父类)
[super class] 返回receiver(调用者)
[super superclass] 返回receiver的父类(调用者的父类)

ps:调用 [super class] 返回的是当前调用者,而这里只是代表向父类查找。

最后返回的对象根据当前调用者有关。 当调用class返回的是

-(Class)class{
  reture [objc_getClass(self)];
}

当调用superclass返回的是

-(Class)superclass{
  reture [class_getSuperclass(objc_getClass(self)];
}
// 也就是当前类的父类

如果觉得有用就关注吧