[self class] [self superclass]

2019-02-01  本文已影响4人  高乔人

这里我先说结论:
[self class] 返回的肯定是方法调动者
[self 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的父类

上一篇下一篇

猜你喜欢

热点阅读