美文网首页ios
ios开发SEL和IMP

ios开发SEL和IMP

作者: 反调唱唱 | 来源:发表于2016-07-05 12:45 被阅读4950次

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:)];

相关文章

  • ios开发SEL和IMP

    SEL的基本使用方法 创建SEL: SEL s1 = @selector(test1); SELs2=NSSele...

  • iOS IMP和SEL

    SEL : 类成员方法的指针,但不同于C语言中的函数指针,函数指针直接保存了方法的地址,但SEL只是方法编号。 I...

  • OC底层原理探索—Method Swizzling方法交换

    sel 和 imp 在讲Method Swizzling前先讲一下sel 和 imp sel:方法编号,在read...

  • iOS SEL 和 IMP 关系?

    SEL : 类成员方法的指针,但不同于C语言中的函数指针,函数指针直接保存了方法的地址,但SEL只是方法编号。 I...

  • iOS SEL、Method 和 IMP

    面试题:Runtime中,SEL、Method 和 IMP有什么区别,使用场景? 答:它们之间的关系可以这么解释:...

  • iOS开发-iOS中的SEL,IMP和isa

    SEL:类成员方法的指针。(不同于C语言中的函数指针,函数指针直接保存了方法的地址,SEL只是方法编号) IMP:...

  • SEl和IMP

    一,SEl和IMP到底是什么 SEL : 类成员方法的指针,但不同于C语言中的函数指针,函数指针直接保存了方法的地...

  • 3-1 runtime-isa数据结构

    IMP:一个函数指针,保存了方法的地址 一张SEL和IMP的对应表 通过SEL可以找到IMP runtime ...

  • iOS方法交换研究

    1、Class/SEL/Method/IMP Class+SEL=>Method=>IMP,... 2、class...

  • iOS IMP 与 SEL

    IMP 官方文档 SEL 官方文档 sel_registerName 通过SEL 找到对应的IMP并调用 meth...

网友评论

    本文标题:ios开发SEL和IMP

    本文链接:https://www.haomeiwen.com/subject/svnjlttx.html