我們知道在OC中,所有的方法調用最終都會轉換成objc_msgSend
形式的方法調用。如下圖:
Xnip2018-10-24_16-31-38.png
而對于調用父類的方法,用的是另一個方法objc_msgSendSuper
。
Xnip2018-10-24_16-40-01.png
我們再來看看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成員變量就指向當前的對象。
我們再回來來看看方法傳遞的流程
Xnip2018-10-24_16-59-46.png
我們會在方法緩存章節中詳細說明系統是如何進行方法緩存的