method_t

  • method_t 是对方法 / 函数的封装
struct method_t {
    SEL name;						// 方法名
    const char *types;	// 编码(返回值类型,参数类型)
    IMP imp;						// 指向方法的指针(方法地址)
}
  • IMP 代表函数的具体实现
/// A pointer to the function of a method implementation. 
typedef id _Nullable (*IMP)(id _Nonnull, SEL _Nonnull, ...); 
  • SEL 代表方法 / 函数名,一般叫做选择器,底层结构跟 char * 类似
    • 可以通过 @selector()sel_registerName() 获得;
    • 可以通过 sel_getName()NSStringFromSelector() 转成字符串;
    • 不同类中相同名字的方法所对应的方法选择器是相同的。
/// An opaque type that represents a method selector.
typedef struct objc_selector *SEL;
  • types 包含了函数返回值、参数编码的字符串

返回值 + 参数 1 + 参数 2 + ...... + 参数 n

  • iOS 中提供了一个叫做 @encode 的指令,可以将具体的类型表示成字符串编码
char *buf1 = @encode(int **);
char *buf2 = @encode(struct key);
char *buf3 = @encode(Rectangle);
Code Meaning
c A char
i An int
s A short
l A long
l is treated as a 32-bit quantity on 64-bit programs.
q A long long
C An unsigned char
I An unsigned int
S An unsigned short
L An unsigned long
Q An unsigned long long
f A float
d A double
B A C++ bool or a C99 _Bool
v A void
* A character string (char *)
@ An object (whether statically typed or typed id)
# A class object (Class)
: A method selector (SEL)
[array type] An array
{name=type…} A structure
(name=type…) A union
bnum A bit field of num bits
^type A pointer to type
? An unknown type (among other things, this code is used for function pointers)