今日搞清楚三个东西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的帮助。希望这样说能对大家的理解有所帮助。
后面会上代码了,单纯的讲太枯燥无味,还是让实践来明了一切吧。。。