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. 成都UBER优步司机第六组奖励政策

    保底时段详解 滴滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs. ...

  2. poj 2686 Traveling by Stagecoach ---状态压缩DP

    题意:给出一个简单带权无向图和起止点,以及若干张马车车票,每张车票可以雇到相应数量的马. 点 u, v 间有边时,从 u 到 v 或从 v 到 u 必须用且仅用一张车票,花费的时间为 w(u, v) ...

  3. Java设计模式--------建造者模式(Builder模式)

    Builder模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构 ...

  4. C++ 数据结构学习二(单链表)

    模板类 //LinkList.h 单链表#ifndef LINK_LIST_HXX#define LINK_LIST_HXX#include <iostream>using namespa ...

  5. 内存管理之二——Cocos2d-x学习历程(六)

    1.工厂方法 工厂方法是程序设计中一个经典的设计模式,指的是基类中只定义创建对象的接口,将实际的实现推迟到子类中. CCObject* factoryMethod() { CCObject* ret ...

  6. VueJS搭建简单后台管理系统框架 (二) 模拟Ajax数据请求

    开发过程中,免不了需要前台与后台的交互,大部分的交互都是通过Ajax请求来完成,在服务端未完成开发时,前端需要有一个可以模拟Ajax请求的服务器. 在NodeJs环境下,通过配置express可访问的 ...

  7. jQuery中find()和filter()的区别

    filter(expr):筛选出与指定表达式匹配的元素的元素集合,其中expr可以是多个选择器的组合.是对自身集合元素的筛选. find()会在元素内寻找匹配元素,而filter()是筛选元素:是对它 ...

  8. J2SE知识点摘记(二十三)

    我们简单介绍一下这个接口: 1.4.3        Comparable 接口 在 java.lang 包中,Comparable 接口适用于一个类有自然顺序的时候.假定对象集合是同一类型,该接口允 ...

  9. Telnet RFC

    http://tools.ietf.org/html/rfc857 http://www.faqs.org/rfcs/rfc854.html 不错: http://blog.csdn.net/chao ...

  10. Delphi Socket Demo

    Delphi Socket Demo 转自  http://www.anqn.com/dev/delphi/2010-01-07/a09122531-1.shtml   自己对中间有点修改,下面是代码 ...