SEL的基本使用方法
创建SEL:
SEL s1 = @selector(test1);
SEL s2 = NSSelectorFromString(@"test1");
转化SEL为NSString:
NSString *str = NSStringFromSelector(@selector(test));
根据SEL来调用一个方法:
[Obj performSelector:@selector(s1)];
和c语言不同,在oc中方法的重载是根据标签来识别区分的,并不是根据参数名来区分。比如:
虽然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:)];
网友评论