我们知道在OC中,所有的方法调用最终都会转换成objc_msgSend
形式的方法调用。如下图:
而对于调用父类的方法,用的是另一个方法objc_msgSendSuper
。
我们再来看看super的结构体
/// Specifies the superclass of an instance.
/// 指定实例的超类。
struct objc_super {
/// Specifies an instance of a class.
/// 指定类的实例
__unsafe_unretained _Nonnull id receiver;
/// Specifies the particular superclass of the instance to message.
#if !defined(__cplusplus) && !__OBJC2__
/* For compatibility with old objc-runtime.h header */
__unsafe_unretained _Nonnull Class class;
#else
__unsafe_unretained _Nonnull Class super_class;
#endif
/* super_class is the first class to search */
};
我们重点关注__unsafe_unretained _Nonnull id receiver;
这个对象,super是一个编译器关键字,经过编译器编译后,会被解析成objc_super类型的结构体指针,而其中的receiver成员变量就指向当前的对象。
我们再回来来看看方法传递的流程
我们会在方法缓存章节中详细说明系统是如何进行方法缓存的