Runtime-(三)消息传递机制

我们知道在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成员变量就指向当前的对象。

我们再回来来看看方法传递的流程

Runtime-(三)消息传递机制_第1张图片
Xnip2018-10-24_16-59-46.png

我们会在方法缓存章节中详细说明系统是如何进行方法缓存的

你可能感兴趣的:(Runtime-(三)消息传递机制)