-
method_t 是对方法/函数的封装
struct method_t {
// "big" method传统意义上的方法(用selector、类型和实现的三指针结构体)
struct big {
SEL name;// 函数名
const char *types;// 编码(返回值类型、参数类型)
MethodListIMP imp;// 指向函数的指针
};
private:
// "small" method是用名称、类型和实现3个相对偏移指针
struct small {
// 名称字段指向一个selector(共享缓存中),或者指向一个selref(在其他地方)
RelativePointer<const void *> name;
RelativePointer<const char *> types;
RelativePointer<IMP> imp;
...
};
public:
// 与方法列表一起使用的指针修饰符。当方法列表中包含小方法时,设置指针的底部位。
// 我们在其他地方使用底部位来区分大方法和小方法。
struct pointer_modifier {
template <typename ListType>
static method_t *modify(const ListType &list, method_t *ptr) {...}
};
...
};
-
SEL代表方法/函数名,一般叫选择器(selector),底层结构类似char*
不同类中相同名字的方法,所对应的selector都相同且唯一。可以通过@Selector()和sel_registerName()获得
-
Type Encoding
iOS文档中提供了@encode()指令,可以将具体的类型表示成字符串编码
网友评论