runtime 学习笔记(三)

    今日搞清楚三个东西SEL、IMP、Method

(一、)SEL

    SEL是selector在Object-C中的表示类型。selector可以理解为区别方法的ID。

typedefstructobjc_selector *SEL;

    objc_selector的定义如下:

struct objc_selector {

char *name;                      OBJC2_UNAVAILABLE;// 名称

char *types;                      OBJC2_UNAVAILABLE;// 类型

};

    通过SEL可以迅速定位到IMP(下文会讲解)

(二、)IMP

    在objc.h中IMP有如下定义:

typedef id (*IMP)(id, SEL, ...);

    IMP是“implementation”的缩写,它是由编译器生成的一个函数指针。当你发起一个消息后(下文介绍),这个函数指针决定了最终执行哪段代码。

(三、)Method

    Method的定义:

typedefstructobjc_method *Method;

    objc_method的定义如下:

structobjc_method {

SEL method_name                  OBJC2_UNAVAILABLE;// 方法名

char*method_types                OBJC2_UNAVAILABLE;// 方法类型IMP 

method_imp                    OBJC2_UNAVAILABLE;// 方法实现

}

    方法名method_name类型为SEL,上文提到过。

    方法类型method_types是一个char指针,存储着方法的参数类型和返回值类型。

    方法实现method_imp的类型为IMP,上文提到过。

    单个指出来可能大家都能理解这个三个东西分别是什么,但是放在一起有的人就是搞不明白,它们三者到底是个什么关系?我是这样理解的:SEL可以想成一个key,IMP可以想成value,而Method可以想成key到value的映射方法。不知道这样说是否更容易理解。

     即通过SEL可以迅速的定位到IMP,但是要有Method的帮助。希望这样说能对大家的理解有所帮助。


    后面会上代码了,单纯的讲太枯燥无味,还是让实践来明了一切吧。。。

你可能感兴趣的:(runtime 学习笔记(三))