Objective-C中的SEL (转载)

 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

时间: 2024-10-10 02:27:01

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

objective C中的字符串(三)

holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7343561 objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的操作字符串,下面举几个例子: 1.创建: 直接利用等号赋值 NSString *

objective C中的字符串

holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7343561 objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的操作字符串,下面举几个例子: 1.创建: 直接利用等号赋值 NSString *

Object-c 中的 SEL

SEL 在Objective-C中,SEL是选择器(selector)的一个类型.选择器就是指向方法的一个指针,读者可以简单理解为程序运行到这里就会执行指定的方法,可以这样定义一个选择器: SEL action = [button action]; 我们这样使用一个选择器,下面的选择器都叫做action: [Foo action] [Bar action] 在Target-Action 模式(Cocoa 程序中的一种常用模式)中:Target 指定了一个类,Action指定一个方法.在一个对象上

Python 查找Twitter中最流行(转载最多)的10个Tweet

CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-4 @author: guaguastd @name: find_popular_retweets.py ''' # Finding the most popular retweets def popular_retweets(statuses): retweets = [ # Store out a tuple of these three values.

Delphi中控制Excel(转载)

用Delphi从数据库中取得资料,然后导出到Excel中做成报表是个不错的选择,因为Excel强大的报表功能那可是没话说前提Delphi中要 uses comobj;var Excel:Variant;一.Excel操作1.创建Excel对象Excel := CreateOleObject( Excel.Application );2.显示ExcelExcel.Visible:=true;3.更改标题Excel.Caption:=Excel的标题;4.退出ExcelExcel.Quit;二.工作

objective C中继承、协议、分类和多态的实现

第一.objective C中继承的实现 在oc中只有实例变量会有权限控制,实例方法和类方法是没有权限控制的,这点与c++不同,OC默认的是protected,并且在声明权限控制时,没有分号 在OC中可以像C++一样用指针运算法来访问实例变量 Rectangle.h 文件代码: #import <Foundation/Foundation.h> @interface Rectangle : NSObject { int _width; int _height; } @property (non

iOS中的copy 转载

小结iOS中的copy http://www.jianshu.com/p/5254f1277dba  转载自: 介绍copy和mutableCopy 介绍深拷贝与浅拷贝 block为什么要用copy copy相对于直接赋值的好处 总结 预备知识 : 内存的栈区 : 由编译器自动分配释放, 存放函数的参数值, 局部变量的值等. 其操作方式类似于数据结构中的栈. 内存的堆区 : 一般由程序员分配释放, 若程序员不释放, 程序结束时可能由OS回收. 注意它与数据结构中的堆是两回事, 分配方式倒是类似于

Linux查找和替换目录下所有文件中字符串(转载)

转自:http://rubyer.me/blog/1613/ 单个文件中查找替换很简单,就不说了.文件夹下所有文件中字符串的查找替换就要记忆了,最近部署几十台linux服务器,记录下总结. 查找文件夹下包含字符串的文件 例:查找/usr/local目录下所有包含”rubyer.me”的文件. grep -lr 'rubyer.me' /usr/local/* vim替换单个文件中所有字符串方法 例:替换当前文件中所有old为new :%s/old/new/g #%表示替换说有行,g表示替换一行中

Objective C中定义可变参函数

Objective C中有很多不定参函数,例如NSLog(format, arg1, arg2),还有字符串或数组在构造时所用的[NSString stringWithFormat: format, arg1, arg2, arg3],它们的方法原型分别是: FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2); + (id)stringWithFormat:(NSString *)format,