Objective-C中的SEL (转载)
SEL
在Objective-C中,SEL是选择器(selector)的一个类型。选择器就是指向方法的一个指针,读者可以简单理解为程序运行到这里就会执行指定的方法,可以这样定义一个选择器:
- SEL action = [button action];
我们这样使用一个选择器,下面的选择器都叫做action:
- [Foo action]
- [Bar action]
在Target-Action 模式(Cocoa 程序中的一种常用模式)中:Target 指定了一个类,Action指定一个方法。在一个对象上设置Action就是通过选择器完成的:
- -(void)setTarget:(id)target;
- -(void)setAction:(SEL)action;
下述语句设置了一个button对象上的Action为“@selector(start:)”,即它调用start方法:
- [button setAction:@selector(start:)];
如果你的方法上有两个参数,比如:
- -(void)setName:(NSString *)name age:(int)age;
那么,你的选择器应该这样书写:
- SEL sel = @selector(setName:age:);
如果方法不存在的话,调用该方法的应用可能会异常中止。所以,需要使用respondsToSelector 方法来判断该对象是否存在对应的方法,使用performSelector:withObject:方法来调用选择器:
- SEL sel = @selector (start:) ; // 指定action
- if ([obj respondsToSelector:sel]) { //判断该对象是否有相应的方法
- [obj performSelector:sel withObject:self]; //调用选择器方法
- }
下面来看一个应用选择器的实例。
【例2-16】选择器实例。
- #import <Foundation/Foundation.h>
- @interface ClassA : NSObject {
- }
- - (void) print;
- @end
- @implementation ClassA
- - (void) print{
- NSLog (@"I'm ClassA.") ;
- }
- @end
- int main (int argc, const char * argv[]) {
- NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
- SEL sel = @selector (print) ;
- ClassA *classA = [[ClassA alloc]init];
- [classA performSelector:sel withObject:nil]; //调用选择器指定的方法
- [pool drain];
- return 0;
- }
【程序结果】
- I'm ClassA.
下面解释一下这段代码,读者有可能看不明白,因为到目前为止并没有讲述类相关的知识。读者只需要了解上述例子中选择器的用法即可,关于类的知识,会在后面的章节详细阐述。
代码首先创建了一个名字叫ClassA 的类,它只包含一个方法print。在随后的实现文件中,我们实现了这个方法:
- - (void) print{
- NSLog (@"I'm ClassA.") ;
- }
读者不难看出,这个方法仅仅是打印到控制台上一句话。在接下来的main方法中,定义了一个选择器sel,它指向的是一个名叫print 的方法。我们并不知道这个方法是哪个类的,因为具体的信息是在运行期间系统自动帮我们判断的。
- SEL sel = @selector (print) ;
随后构建了一个对象(读者不用拘泥于语法,我们会在后面的章节详细阐述),并调用这个对象performSelector:withObject:的方法。
- ClassA *classA = [[ClassA alloc]init];
- [classA performSelector:sel withObject:nil];
这时候,系统就会自动调用classA对象的print方法,最终得到程序运行结果。
上述文章是转载csdn中一位大神的,后续我会以具体示例代码来展示
IOS QQ群:5883244
Objective-C中的SEL (转载)的更多相关文章
- objective C中的字符串NSStirng常用操作
objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的 ...
- 理解Objective C 中id
什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...
- 浅谈Objective—C中的面向对象特性
Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...
- OC中的SEL解析
OC中的SEL对象即selector对象,用来保存一个方法的地址.下面通过一个Demo来解析SEL的原理.创建一个Person类,Person.h中: #import <Foundation/F ...
- git在eclipse中的配置 转载
git在eclipse中的配置 转载 一_安装EGIT插件 http://download.eclipse.org/egit/updates/ 或者使用Eclipse Marketplace,搜索EG ...
- C#高级编程六十九天----DLR简介 .在.NET中使用DLR(转载) 我也来说说Dynamic
DLR 一.近年来,在TIOBE公司每个月发布的编程语言排行榜中,C#总是能挤进前十名,而在最近十年来,C#总体上呈现上升的趋势.C#能取得这样的成绩,有很多因素,其中它在语言特性上的锐意进取让人印象 ...
- C# json反序列化 对象中嵌套数组 (转载) 可能会导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
C# json反序列化 对象中嵌套数组 (转载) 看图: 这里可以看到是二层嵌套!!使用C#如何实现?? 思路:使用list集合实现 → 建立类 → list集合 → 微软的 Newtonso ...
- UIWebView保存网页中的图片(转载)
现在H5混合原生开发的方式越来越流行,也就要用到UIWebView控件.在开发过程中,我们可能会遇到一个需求,要求我们保存网页上的图片,当用户点击图片的时候,就可以让用户选择是否下载图片. 在系统自带 ...
- Objective C中的ARC的修饰符的使用---- 学习笔记九
#import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...
随机推荐
- C语言对象化编程
以下为一个引子: C中struct的函数实现,只能用函数指针成员. C结构体内不能有函数的代码,但可以有函数的指针. C/C code Code highlighting produced by Ac ...
- Linux学习十七、正规表达式练习题
情境模拟题一:透过 grep 搜寻特殊字串,并配合数据流重导向来处理大量的文件搜寻问题. 目标:正确的使用正规表示法: 前提:需要了解数据流重导向,以及透过子命令 $(command) 来处理档名的搜 ...
- hdu 5583 Kingdom of Black and White(模拟,技巧)
Problem Description In the Kingdom of Black and White (KBW), there are two kinds of frogs: black fro ...
- BaseAdapter 注意的关键点!
BaseAdapter 我们一般就是继承然后重写自定义,然后listview set进去即可! 数据改变的时候,我们习惯这样: public void update(List list) { ...
- ssh框架用JUnit测试
public class testAuxDict { //读spring配置文件 public static BeanFactory factory = new ClassPathXmlApplica ...
- provider: Named Pipes Provider, error: 40 - 无法打开到 SQL Server 的连接
问题描述: SQL Sever2012 中:在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server 已配置为 ...
- C#自定义字符串替换Replace方法
前一阵遇到一个如标题的算法题,是将原有字符串的某些片段替换成指定的新字符串片段,例如将源字符串:abcdeabcdfbcdefg中的cde替换成12345,得到结果字符串:ab12345abcdfb1 ...
- 使用EXTEND方式来分段处理大表的搬数据
创建一个表: 记录rowid的分区段并作为处理的日志表: DROP TABLE DEAL_TABLE_EXTENT; CREATE TABLE DEAL_TABLE_EXTENT(seq ...
- vue分页组件table-pagebar
之前一直接触都是原始的前端模型,jquery+bootstrap,冗杂的dom操作,繁琐的更新绑定.接触vue后,对前端MVVM框架有了全新的认识.本文是基于webpack+vue构建,由于之前的工作 ...
- js数组与对象的一些区别。
之前以为js对象即数组,今天用length取对象的长度老是undefined,用concat合并两个对象也不行,于是网上找了一下, 获取对象的长度 function length(o) { var c ...