Runtime-(三)消息傳遞機(jī)制

我們知道在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)行方法緩存的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容