SEL

在Objective-C中,SEL是选择器(selector)的一个类型。选择器就是指向方法的一个指针,读者可以简单理解为程序运行到这里就会执行指定的方法,可以这样定义一个选择器:

  1. SEL action = [button action];

我们这样使用一个选择器,下面的选择器都叫做action:

  1. [Foo action]
  2. [Bar action]

在Target-Action 模式(Cocoa 程序中的一种常用模式)中:Target 指定了一个类,Action指定一个方法。在一个对象上设置Action就是通过选择器完成的:

  1. -(void)setTarget:(id)target;
  2. -(void)setAction:(SEL)action;

下述语句设置了一个button对象上的Action为“@selector(start:)”,即它调用start方法:

  1. [button setAction:@selector(start:)];

如果你的方法上有两个参数,比如:

  1. -(void)setName:(NSString *)name age:(int)age;

那么,你的选择器应该这样书写:

  1. SEL sel = @selector(setName:age:);

如果方法不存在的话,调用该方法的应用可能会异常中止。所以,需要使用respondsToSelector 方法来判断该对象是否存在对应的方法,使用performSelector:withObject:方法来调用选择器:

  1. SEL sel = @selector (start:) ; // 指定action
  2. if ([obj respondsToSelector:sel]) { //判断该对象是否有相应的方法
  3. [obj performSelector:sel withObject:self]; //调用选择器方法
  4. }

下面来看一个应用选择器的实例。

【例2-16】选择器实例。

  1. #import <Foundation/Foundation.h>
  2. @interface ClassA : NSObject {
  3. }
  4. - (void) print;
  5. @end
  6. @implementation ClassA
  7. - (void) print{
  8. NSLog (@"I'm ClassA.") ;
  9. }
  10. @end
  11. int main (int argc, const char * argv[]) {
  12. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  13. SEL sel = @selector (print) ;
  14. ClassA *classA = [[ClassA alloc]init];
  15. [classA performSelector:sel withObject:nil]; //调用选择器指定的方法
  16. [pool drain];
  17. return 0;
  18. }

【程序结果】

  1. I'm ClassA.

下面解释一下这段代码,读者有可能看不明白,因为到目前为止并没有讲述类相关的知识。读者只需要了解上述例子中选择器的用法即可,关于类的知识,会在后面的章节详细阐述。

代码首先创建了一个名字叫ClassA 的类,它只包含一个方法print。在随后的实现文件中,我们实现了这个方法:

  1. - (void) print{
  2. NSLog (@"I'm ClassA.") ;
  3. }

读者不难看出,这个方法仅仅是打印到控制台上一句话。在接下来的main方法中,定义了一个选择器sel,它指向的是一个名叫print 的方法。我们并不知道这个方法是哪个类的,因为具体的信息是在运行期间系统自动帮我们判断的。

  1. SEL sel = @selector (print) ;

随后构建了一个对象(读者不用拘泥于语法,我们会在后面的章节详细阐述),并调用这个对象performSelector:withObject:的方法。

  1. ClassA *classA = [[ClassA alloc]init];
  2. [classA performSelector:sel withObject:nil];

这时候,系统就会自动调用classA对象的print方法,最终得到程序运行结果。

上述文章是转载csdn中一位大神的,后续我会以具体示例代码来展示

IOS QQ群:5883244

Objective-C中的SEL (转载)的更多相关文章

  1. objective C中的字符串NSStirng常用操作

    objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的 ...

  2. 理解Objective C 中id

    什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...

  3. 浅谈Objective—C中的面向对象特性

    Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...

  4. OC中的SEL解析

    OC中的SEL对象即selector对象,用来保存一个方法的地址.下面通过一个Demo来解析SEL的原理.创建一个Person类,Person.h中: #import <Foundation/F ...

  5. git在eclipse中的配置 转载

    git在eclipse中的配置 转载 一_安装EGIT插件 http://download.eclipse.org/egit/updates/ 或者使用Eclipse Marketplace,搜索EG ...

  6. C#高级编程六十九天----DLR简介 .在.NET中使用DLR(转载) 我也来说说Dynamic

    DLR 一.近年来,在TIOBE公司每个月发布的编程语言排行榜中,C#总是能挤进前十名,而在最近十年来,C#总体上呈现上升的趋势.C#能取得这样的成绩,有很多因素,其中它在语言特性上的锐意进取让人印象 ...

  7. C# json反序列化 对象中嵌套数组 (转载) 可能会导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

    C# json反序列化 对象中嵌套数组 (转载)   看图: 这里可以看到是二层嵌套!!使用C#如何实现?? 思路:使用list集合实现 → 建立类 → list集合 → 微软的   Newtonso ...

  8. UIWebView保存网页中的图片(转载)

    现在H5混合原生开发的方式越来越流行,也就要用到UIWebView控件.在开发过程中,我们可能会遇到一个需求,要求我们保存网页上的图片,当用户点击图片的时候,就可以让用户选择是否下载图片. 在系统自带 ...

  9. Objective C中的ARC的修饰符的使用---- 学习笔记九

    #import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...

随机推荐

  1. git push报错

    git: No refs in common and none specified; doing no (2012-10-28 11:43:10) 转载▼ 标签: 杂谈 分类: 项目管理 用gitol ...

  2. Linux内核源代码解析——用户发送数据包的起源之sendto

    本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/10162853 Jack:我想知道用户如何把数据发送到 ...

  3. Attempt to call getDuration without a valid mediaplayer

    最近在做一个播放器的小例子,中途遇到 了这个错: Attempt to call getDuration without a valid mediaplayer 解决参考方案如下: 一是如果media ...

  4. javascrip格式

    1:若Button_Search_onclick()方法不存则在页面在火狐浏览器是可以正常运行,但是在IE浏览器就会出现问题 建议删除没用到的方法

  5. poj1995-快速幂取模

    #include<iostream> #define LL long long using namespace std; //快速幂算法 LL pow(LL a,LL b,int m){ ...

  6. jquery写的tab切换效果 非常简单

    自己写的一款 tab切换效果,比较简单,适合新手 <style type="text/css">*{margin:0; padding:0; font-size:12p ...

  7. hdu 5649 DZY Loves Sorting 二分+线段树

    题目链接 给一个序列, 两种操作, 一种是将[l, r]里所有数升序排列, 一种是降序排列. 所有操作完了之后, 问你a[k]等于多少. 真心是涨见识了这题..好厉害. 因为最后只询问一个位置, 所以 ...

  8. codeforces 652E . Pursuit For Artifacts 强连通分量

    题目链接 题目大意: 给一个图, n个点m条边, 某些边上面有权值. 一条边只能走一次, 给两个点s, t. 问你, 从s到t能否经过有权值的边. 首先肯定要缩点, 然后看同一个连通分量里面的边, 是 ...

  9. c语言:从一组数据中选出可以组成三角形并且周长最长的三个数(简单)

    题目如下: 思路分析: 写出完整的程序: /* 问题描述: 有n根棍子,棍子i的长度为ai.想要从中选出3根棍子组成周长尽可能长的三角形.请输 出最大的周长,若无法组成三角形则输出0. */ #inc ...

  10. 【Chromium中文文档】插件架构

    插件架构 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Plugin_A ...