5.4 SEL类型
1 id cattle[3];
2 SEL say;
3 SEL skin;
其中id cattle[3]定义了一个数组用于存储Cattle或者Bull对象。这一行代码估计大家都很熟悉,笔者就不赘述了。像这样的传统的数组并不能完全满足我们的需求,当我们需要做诸如追加,删除等操作的时候,会很不方便。在随后的章节里面笔者将要向大家介绍传统数组的替代解决方案NSArray。
上一段代码的第二行和第三行是本节所关注的,就是SEL类型。Objective-C在编译的时候,会根据方法的名字(包括参数序列),生成一个用 来区分这个方法的唯一的一个ID,这个ID就是SEL类型的。我们需要注意的是,只要方法的名字(包括参数序列)相同,那么它们的ID都是相同的。就是 说,不管是超类还是子类,不管是有没有超类和子类的关系,只要名字相同那么ID就是一样的。除了函数名字和ID,编译器当然还要把方法编译成为机器可以执 行的代码,这样,在一个编译好的类里面,就产生了如下图所示方法的表格示意图(本构造属于笔者推测,没有得到官方证实,所以图5-2为示意图仅供参考,我们可以暂时认为是这样的)。
图5-2,方法的表格示意图
请注意setSkinColor后面有一个冒号,因为它是带参数的。由于存在这样的一个表格,所以在程序执行的时候,我们可以方便的通过方法的名字,获取到方法的ID也就是我们所说的SEL,反之亦然。具体的使用方法如下:
1 SEL 变量名 = @selector(方法名字);
2 SEL 变量名 = NSSelectorFromString(方法名字的字符串);
3 NSString *变量名 = NSStringFromSelector(SEL参数);
其中第1行是直接在程序里面写上方法的名字,第2行是写上方法名字的字符串,第3行是通过SEL变量获得方法的名字。我们得到了SEL变量之后,可以通过下面的调用来给一个对象发送消息:
[对象 performSelector:SEL变量 withObject:参数1 withObject:参数2];
这样的机制大大的增加了我们的程序的灵活性,我们可以通过给一个方法传递SEL参数,让这个方法动态的执行某一个方法;我们也可以通过配置文件指定需要执行的方法,程序读取配置文件之后把方法的字符串翻译成为SEL变量然后给相应的对象发送这个消息。
从效率的角度上来说,执行的时候不是通过方法名字而是方法ID也就是一个整数来查找方法,由于整数的查找和匹配比字符串要快得多,所以这样可以在某种程度上提高执行的效率。
分享到:
相关推荐
第 1 章,也就是本章 第 2 章,从 Hello,World!...第 5 章,Class 类型,选择器 Selector 以及函数指针 第 6 章,NSObject 的奥秘 第 7 章,对象的初始化以及实例变量的作用域 第 8 章,类方法以及私有方法
复制为选择器或@selector()或NSSelectorFromString() 复制为objc_msgSend()片段 复制为符号断点表达式 复制为宏片段 支持属性 getter/setter 按住 Alt 键更改样式变化 ##Installation 下载项目,构建,重新启动 ...
一个满足您日常HTML需求的Objective-C框架。 快速概述 HTMLKit是符合的框架,用于解析和序列化iOS和OSXHTML文档和文档片段。 HTMLKit以与现代Web浏览器相同的方式解析实际HTML。 HTMLKit提供了丰富的DOM实现,用于...
photo-selector-to-animation 照片选择器转场动画
CSS(Selector Level 4)选择器的DOM元素选择操作目标是能随便写,比如jQuery的DOM选择。 易于使用的 Web 客户端 API(未实现) 例子 # import int main ( int argc, char **argv) { const NSString *...
UIToolbar类别,用于创建对文本输入视图有用的工具栏,例如,iOS的键盘或选择器 依存关系 安装 将UIToolbar + KeyboardAdditions.h和UIToolbar + KeyboardAdditions.m文件添加到您的项目中。 用法 带有完成按钮的...
图像和视频选择器,支持多种选择和多种自定义。 由iOS 8 Photo框架提供支持。 这是Guillermo Muntaner生产的GMImagePicker组件的从1到1的端口,从Objective-C到Xamarin.iOS的C#。 原始资源可以在这里找到: 。 该...
LRVariadicPerformSelector 因为有时候,我们需要使用两个以上的参数来执行选择器... 同样,这个简单的类别允许选择注入我们要在其上执行选择器的队列( dispatch_queue_t或NSOperationQueue )。安装使用CocoaPods ...
检测到蓝牙已打开,您需要注册通知[[NSNotificationCenter defaultCenter] addObserver:self选择器:@selector(discoverNotify :)名称:bKey_Device_Ble_On对象:无]; 3.搜索蓝牙设备[[AXATagManager ...
CNCityPickerViewA support of Interface Builder and code to create custom very high level Chinese City Selector.UsageWritten code.// 使用代码的方式添加也行CGRect pickerViewFrame = CGRectMake(0, self....
SKAsyncGLViewController-替代传统的GLKit堆栈(GLKView + GLKViewController)。 它在后台GCD线程中呈现所有内容... :black_nib_selector: :pencil_selector: 在这里,您可以绘制所有内容! -(无效)clearGL :cro
相反,它管理一个持久性存储协调器,可以将其配置为与您选择的任意数量的持久性存储进行通信。 要求 PFIncrementalStore需要订阅Parse,有效的Parse App,API密钥和密钥以及少量的编程知识。 解析订阅和API信息可从...
Swift中适用于iOS的自定义条纹签出 :rocket: :rocket: :fire: :fire: 这个开源Swift项目建立在提供的自定义iOS Checkout项目之上...收货地址选择器 模块化代码 很棒的详细文档 编码为 :red_heart_selector: 通过和 。