我们在研究Runtime的时候,会有一些基本数据类型的概念,时间久了,容易忘记,在此,进行记录。
>SEL
SEL 是 selector 在 Objc 中的表示,selector 是方法选择器,其作用就和名字一样,通过名字可以找到对应的方法实现。
代码中声明,如下
@property (nonatomic, assign) SEL selector;
>Id 和isa
id 是一个参数类型,它指向某个类的实例的指针。定义如下:
isa指针:指向对象所属的类,isa的值是class的地址。
>Method
Method 代表了某个方法的类型,结构如下:
>IMP
IMP 是一个函数指针,当我们发起一个 ObjC 消息之后,最终它会执行的那段代码,就是由这个函数指针指定的。即,IMP 函数指针指向对应方法的实现。
>Ivar
Ivar 用于表示成员变量的类型,结构如下:
char *ivar_name:变量名;
char *ivar_type:变量类型;
int ivar_offset:基地址偏移字节;
>Cache
Cache 主要为方法调用的性能进行优化,每当实例对象接收到一个消息时,它不会直接在 isa 指针 指向的类的方法列表中遍历查找能够响应的方法,而是优先在 Cache 中查找。
>Class
Class是一个类(也是一个对象,叫类对象,因为它继承至objc_object),对应runtime中objc_class的数据结构(是结构体)。
Class isa:指向元类的指针;
Class super_class:指向父类的指针;
const char *name:类名;
long version:版本号;
info:信息;
long instance_size:实例变量大小;
struct objc_ivar_list *ivars:所有的成员变量、属性的信息都放在链表 ivars 中,ivars 是一个数组,数组中每个元素是指向 Ivar(变量信息) 的指针;
struct objc_method_list **methodLists:存放了该类的所有成员(-)方法,类(+)方法存在 meta-class(元类) 的objc_method_list 链表中;
struct objc_cache *cache:用于缓存最近调用过的方法,每次调用一个方法后,该方法就会被缓存到 cache 列表中,下次调用的时候 runtime 会优先去 cache 中查找,如果没有,才去 methodLists 中接着查找方法,对于经常用到的方法调用,能提高效率;
struct objc_protocol_list *protocols:遵循的协议列表;