我們知道在OC中,所有的方法調(diào)用最終都會轉(zhuǎn)換成objc_msgSend形式的方法調(diào)用。如下圖:

Xnip2018-10-24_16-31-38.png
而對于調(diào)用父類的方法,用的是另一個方法objc_msgSendSuper。

Xnip2018-10-24_16-40-01.png
我們再來看看super的結(jié)構(gòu)體
/// 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 */
};
我們重點關(guān)注__unsafe_unretained _Nonnull id receiver;這個對象,super是一個編譯器關(guān)鍵字,經(jīng)過編譯器編譯后,會被解析成objc_super類型的結(jié)構(gòu)體指針,而其中的receiver成員變量就指向當(dāng)前的對象。
我們再回來來看看方法傳遞的流程

Xnip2018-10-24_16-59-46.png
我們會在方法緩存章節(jié)中詳細(xì)說明系統(tǒng)是如何進(jìn)行方法緩存的