ios开发SEL和IMP

SEL的基本使用方法

创建SEL:

SEL s1 = @selector(test1);

SEL s2 = NSSelectorFromString(@"test1");

转化SEL为NSString:

NSString *str = NSStringFromSelector(@selector(test));

根据SEL来调用一个方法:

[Obj performSelector:@selector(s1)];


和c语言不同,在oc中方法的重载是根据标签来识别区分的,并不是根据参数名来区分。比如:


ios开发SEL和IMP_第1张图片


ios开发SEL和IMP_第2张图片
ios开发SEL和IMP_第3张图片

虽然test:参数不同,但还是会被编译器认为重复定义了test:这个方法

下面因为标签一个为tA,一个为tD所以不为被认为重新定义方法。

selector顾名思义就是选择器,在ios开发中SEL就是可以根据一个SEL选择对应的方法IMP。

可以理解为:SEL只是描述了一个方法的格式,如果把方法名理解成第一个标签,SEL就是描述一种由几个标签构成的方法,更偏向于c里的函数声明,SEL并不会指向方法。

SEL只和方法标签格式有关,并不绑定类,对于一个多态的方法,可以用同一个SEL去调用。

IMP应该是Implement缩写,表示指向方法的实现地址,可通过IMP来调用方法。

typedef id (*IMP)(id, SEL, ...);

可知:IMP 是一个函数指针,这个被指向的函数包含一个接收消息的对象id(self  指针), 调用方法的选标 SEL (方法名),以及不定个数的方法参数,并返回一个id。也就是说 IMP 是消息最终调用的执行代码,是方法真正的实现代码 。我们可以像在C语言里面一样使用这个函数指针。

实际根据SEL来调用方法的过程是选通过SEL在类里找到对应的IMP然后由IMP去调用方法。

[Obj methodForSelector:@selector(selector:)];

[Obj instanceMethodForSelector:@selector(selector:)];

你可能感兴趣的:(ios开发SEL和IMP)