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中方法的重载是根据标签来识别区分的,并不是根据参数名来区分。比如:



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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,824评论 0 9
  • 继上Runtime梳理(四) 通过前面的学习,我们了解到Objective-C的动态特性:Objective-C不...
    小名一峰阅读 782评论 0 3
  • 1.1 什么是自动引用计数 概念:在 LLVM 编译器中设置 ARC(Automaitc Reference Co...
    __silhouette阅读 5,281评论 1 17
  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 2,465评论 0 35
  • 本文转载自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex阅读 801评论 0 1