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 |
b num |
A bit field of num bits |
^ type |
A pointer to type |
? |
An unknown type (among other things, this code is used for function pointers) |