1.SEL的概述

SEL就是对方法的一种包装,是表示一个方法的selector的指针。包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法,其定义如下:

objc_selector结构体的详细定义没有在头文件中找到。方法的selector用于表示运行时方法的名字。Objective-C在编译时,会依据每一个方法的名字、参数序列,生成一个唯一的整型标识(Int类型的地址),这个标识就是SEL。不用的类里面的相同名字相同声明的方法的身份证明是一样的。这样在程序执行的时候,runtime就不用费力的进行方法的名字比较来确定是执行哪一个方法了,只是通过一个整数的寻找就可以马上定位到相应的方法,然后找到相应的方法的入口地址,这样方法就可以被执行了。

示例代码:

ViewController.m

#import "ViewController.h"
#import "Selector.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.Selector * select =[[Selector alloc]init];[select performSelector:@selector(viewDidLoad) withObject:nil];SEL sel1 =@selector(viewDidLoad);NSLog(@"sel1:%p",sel1);NSLog(@"viewDidLoad:%p",_cmd);//_cmd本身代表所在方法的SEL
}
@end

Selector.m

#import "Selector.h"
@implementation Selector
- (void)viewDidLoad {NSLog(@"Selector:%p",_cmd);
}
@end

上面的输出为:

2016-04-27 11:37:53.883 SEL  @selector()[6278:61711] Selector:0x106f674d5

2016-04-27 11:37:53.884 SEL  @selector()[6278:61711] sel1:0x106f674d5

2016-04-27 11:37:53.884 SEL  @selector()[6278:61711] viewDidLoad:0x106f674d5

注意点:

两个类之间,不管它们是父类与子类的关系,还是之间没有这种关系,只要方法名相同,那么方法的SEL就是一样的。每一个方法都对应着一个SEL。所以在 Objective-C同一个类(及类的继承体系)中,不能存在2个同名的方法,即使参数类型不同也不行。相同的方法只能对应一个SEL。这也就导致 Objective-C在处理相同方法名且参数个数相同但类型不同的方法方面的能力很差。如在某个类中定义以下两个方法:

- (void)setWidth:(int)width;
- (void)setWidth:(double)width;
当然,不同的类可以拥有相同的selector,这个没有问题。不同类的实例对象执行相同的selector时,会在各自的方法列表中去根据selector去寻找自己对应的IMP。
2.SEL的理解
工程中的所有的SEL组成一个Set集合,Set的特点就是唯一,因此SEL是唯一的。因此,如果我们想到这个方法集合中查找某个方法时,只需要去找到这个方法对应的SEL就行了,SEL实际上就是根据方法名hash化了的一个字符串,而对于字符串的比较仅仅需要比较他们的地址就可以了,可以说速度 上无语伦比!!但是,有一个问题,就是数量增多会增大hash冲突而导致的性能下降(或是没有冲突,因为也可能用的是perfect hash)。但是不管使用什么样的方法加速,如果能够将总量减少(多个方法可能对应同一个SEL),那将是最犀利的方法。那么,我们就不难理解,为什么 SEL仅仅是函数名了。

本质上,SEL只是一个指向方法的指针(准确的说,只是一个根据方法名hash化了的KEY值,能唯一代表一个方法),它的存在只是为了加快方法的查询速度。这个查找过程我们将在下面讨论。

我们可以在运行时添加新的selector,也可以在运行时获取已存在的selector,

我们可以通过下面三种方法来获取SEL:

1. sel_registerName函数
2. Objective-C编译器提供的@selector()

3. NSSelectorFromString()方法

SEL的用法主要有一下几种

1.SEL 变量名 = @selector(方法名字); //注意有参数时要带上:
2.SEL 变量名 = NSSelectorFromString(方法名字的字符串);
3.NSString *变量名 = NSStringFromSelector(SEL参数);

参考:

1.http://www.cnblogs.com/yaski/archive/2009/04/05/1429735.html

关于SEL的一些总结相关推荐

  1. SEL | 植物通过根系分泌物招募假单孢菌协助抵抗地上部病原菌侵染

    本篇文章结合以前的研究,系统地总结了根系分泌物介导的植物对地上部病原菌入侵的响应,即地上部病原菌入侵引起根系分泌物中长链脂肪酸和氨基酸分泌量的增加,潜在的有益菌富集.进而通过纯培养的手段分离得到有益菌 ...

  2. SEL重磅:重新认识菌根:菌根真的如普遍认为的那样重要吗?

    澳大利亚科学院院士.荷兰皇家艺术与科学学院院士Hans Lambers评述,尽管随着现代科学技术的发展,人们对菌根的认识不断加深,但菌根真的如人们普遍认为的那样重要吗?目前,关于菌根的一些" ...

  3. SEL|世界土壤日-土壤生态学Nico Eisenhauer 教授讲座

    "土壤生态学"系列学术讲座(二) 报告题目:Thedark side of biodiversity 主讲:Nico Eisenhauer 教授 (德国综合生物多样性研究中心) 主 ...

  4. SEL:世界土壤日Stefan Geisen报告(朱永官院士主持,12月4日)

    "土壤生态学"系列学术讲座(一) 报告题目:Soil biodiversity, microbiomes and their predators: Disentangling th ...

  5. 期刊介绍 | SEL:力争成为土壤生态学界的“Cell”

    期刊简介 http://journal.hep.com.cn/sel SEL(Soil Ecology Letters)(CN 10-1628/S1,ISSN 2662-2289,ISSN onlin ...

  6. OC语言--SEL类型小记

    SEL类型 1 @selector();函数 示例代码: SEL sel = @selector(bark);//把oc的方法名转化为选择器类型SEL//检测判断sel选择器代表的方法,在xiaoho ...

  7. IOS SEL (@selector) 原理及使用总结(一)

    SEL 类成员方法的指针 可以理解 @selector()就是取类方法的编号,他的行为基本可以等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而Object-C的类不能直接应 ...

  8. iOS中的SEl和IMP到底是什么

    SEL : 类成员方法的指针,但不同于C语言中的函数指针,函数指针直接保存了方法的地址,但SEL只是方法编号. IMP:一个函数指针 IMP和SEL关系 每一个继承于NSObject的类都能自动获得r ...

  9. asp mvc @Html.CheckBox(sel,true) 往后台传值问题

    @Html.CheckBox("sel",true) 生成2个输入,而不是一个,这是为什么呢? <input checked="checked" id=& ...

  10. iOS SEL类型和创建

    SEL selAction =NSSelectorFromString([actionArrayobjectAtIndex:indexArray]); [item addTarget:self act ...

最新文章

  1. 云计算:存储之后,IT江湖之上的新大佬
  2. vue2+webpack2实现饿了么移动端商家页面
  3. 均值极差图控制上下限_SPC之I-MR控制图
  4. vscode请更新includepath_VS Code Java 九月更新!Coding Pack for Java 带来一键安装新体验!...
  5. 2Boost之UPD,Client and Server
  6. SpringMVC校验---SpringMVC学习笔记(八)
  7. java如何获得相反的颜色_javascript – 如何根据当前颜色生成相反的颜色?
  8. C/C++基础面试-Sizof的全面理解
  9. python登录界面实现密码在明文与星号间切换_两个API让星号密码框显示成明文
  10. 清华大学成立听觉智能研究中心,要解决可解释和鲁棒性问题
  11. 修复iPhonex不出声的左扬声器
  12. 《数据挖掘概念与技术》第八章 分类:基本概念
  13. python入门之一运算符和表达式第二关:华氏度转摄氏度和进制转换
  14. 在html中做框架的页面,网页中的框架(详解)
  15. 鼠标指针乱跑的解决方案
  16. raspberry pi pico|在raspberry pi pico上玩nes游戏(1)(开源树莓派pico NES模拟器)-效果演示及介绍
  17. Ubuntu (20.4,最新版)安装及简单入门操作
  18. dda算法控制电机_插补计算原理与速度控制.DOC
  19. UE4、UE5凋用第三方PC程序
  20. 大数据就业方向有哪些?

热门文章

  1. iOS开发之地图代理不起作用(提示vImage decode failed, falling back to CG path.)
  2. Exchange2010启用反垃圾邮件功能
  3. win7搭建nas存储服务器_FreeNas 0.7.1:普通电脑变成网络存储服务器
  4. 勾股定理,西方称为毕达哥拉斯定理
  5. java 月份缩写_英文月份简写
  6. 使用itextpdf进行动态盖章,解决PDF页数不确定时签章位置变化问题
  7. IRP IO_STACK_LOCATION 《寒江独钓》内核学习笔记(1)
  8. Excel表格数据的下载
  9. 获取Map的key值的几种方式
  10. C# 基础学习第四天