• 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]; //调用选择器方法  

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

    【例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;  

    【程序结果】

    1. I'm ClassA. 

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

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

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

    读者不难看出,这个方法仅仅是打印到控制台上一句话。在接下来的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

  • 相关阅读:
    GIT 旧库迁移到新库
    Spring Data JPA入门
    (一)《Spring实战》——Spring核心
    easyui框架Date日期类型以json形式显示到前台datagrid时,显示为[object Object]
    《小狗钱钱》笔记——脑图
    ORACLE 两个表或两个结果集的数据对比常用的函数
    SyntaxError: Non-ASCII character 'xe5' in file index.py on line 6, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
    报表查询:收费汇总表
    项目启动时 Exception in thread "HouseKeeper" java.lang.NullPointerException
    eval函数处理JSON数据需要加括号
  • 原文地址:https://www.cnblogs.com/sl372/p/5216169.html
Copyright © 2020-2023  润新知