关于SEL和IMP

1.SEL的基本特点

在内存中每个类的方法都存储在类对象中

每个方法都有一个与之对应的SEL类型的数据

根据一个SEL数据就可以找到对应的方法地址,进而调用方法

SEL类型的定义:  typedef struct objc_selector * SEL


2.SEL对象的创建

SEL s1 = @selector(test1); // 将test1方法包装成SEL对象

SEL s2 = NSSelectorFromString(@"test1"); // 将一个字符串方法转换成为SEL对象


3.SEL和IMP的区别

SEL是一个方法的编号   IMP是函数指针,直接获取函数的内存地址

两者的关系在于在类对象的数据结构中,其存储的实例方法列表(dispatch table)就是用SEL和IMP作为映射关系存在的(其实SEL为整形,其与实例方法有一个表的对应关系,在映射到IMP)。通过SEL和IMP的关系,可以通过runtime动态修改其对应关系,进一步修改方法的实现。


4.关于iOS类的继承关系图


关于SEL和IMP_第1张图片
继承关系图


图中包括三种对象,实例对象,类对象,元类对象

所有的对象均继承于自己的父类,NSObjec 是根类 其继承关系为nil

实例对象的ISA指针指向类对象,类对象的ISA指针指向元类,元类的ISA指针均指向根源类,根源类的ISA指针也指向自己

类对象存储 普通成员变量与普通成员方法(-开头的方法)

元类对象  存储类的static类成员变量与static类成员方法(+开头的方法),在类方法中self关键字代表的是这个类,以self点语法是获取不到其属性的。

你可能感兴趣的:(关于SEL和IMP)