zoukankan      html  css  js  c++  java
  • 【IOS】ObjectC 中的Selector 概念

    selector可以叫做选择器,其实指的就是对象的方法,也可以理解为C语言里面的函数指针,在面向对象里面的对应概念。

    @selector(xxxx)的作用是找到名字为xxxx的方法。一般用于[a performSelector:@selector(b)];就是说去调用a对象的b方法,和[a b];的意思一样,但是这样更加动态一些。@selector(xxxx)返回的类型是SEL,看方法说明的时候如果参数类型是SEL,那么就是要接受@selector(xxxx)返回的值的那种了。
     
     
    在Objc中 SEL的定义是:
    1. typedef struct objc_selector *SEL;
    具体这objc_selector结构体是什么取决与使用GNU的还是Apple的运行时, 在Mac OS X中SEL其实被映射为一个C字符串,可以看作是方法的名字,它并不一个指向具体方法实现(IMP类型才是)。对于所有的类,只要方法名是相同的,产生的selector都是一样的。
     
     
    在iphone程序中会大量看到@selector这样的用法。<<iphone开发基础>花了很大一个篇幅来解析这个语法,但是不知是翻译问题,还是解释过细,不大看得懂,很是不给力.直到程序用这个语法,并且仔细看了一些解析文章。才明白这一语法。
    简而言之,你可以理解 @selector()就是取类方法的编号,他的行为基本可以等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而Object-C的类不能直接应用函数指针,这样只能做一个@selector语法来取.
     
    它的结果是一个SEL类型。这个类型本质是类方法的编号(函数地址)?因此我们有如下代码。
     
    一.取得selector值.
     
    C函数指针

    int add(int val)
    {
    return val+1;
    }


    int (* c_func)(int val);
     //定义一个函数指针变量

    c_func = add ;
     //把函数addr地址直接赋给c_func

    int add(int val)
    {
    return val+1;
    }


    int (* c_func)(int val);
     //定义一个函数指针变量

    c_func = add ; //把函数addr地址直接赋给c_func

     
    object-c的选择器,

    @interface foo
    -(int)add:int val;
    @end


    SEL class_func ;
     //定义一个类方法指针

    class_func = @selector(add:int);

    @interface foo
    -(int)add:int val;
    @end


    SEL class_func ;
     //定义一个类方法指针

    class_func = @selector(add:int);

    注意1. @selector是查找当前类的方法,而[object @selector(方法名:方法参数..) ] ;是取object对应类的相庆方法.
    注意2.查找类方法时,除了方法名,方法参数也查询条件之一.
    注意3. 可以用字符串来找方法 SEL 变量名 = NSSelectorFromString(方法名字的字符串);
    注意4. 可以运行中用SEL变量反向查出方法名字字符串
    NSString *变量名 = NSStringFromSelector(SEL参数);
     
    二.执行selector值.
    取得相庆值后,怎么处理SEL值呢,这一点仍然与函数指针一样,就是执行它
    函数指针执行,(以下有几种等效形式)
    *c_func(10);
    c_func(10);
     
     
    SEL变量的执行.用performSelecor方法来执行.
    [对象 performSelector:SEL变量 withObject:参数1 withObject:参数2];
     
    三.selector的应用场合
    selector本质是跟C的回调函数一样。主要用于两个对象之间进行松耦合的通讯.这种方法很多开发环境用到。比如GTK,Delphi.基本上整个Cocoa库之间对象,控制之间通讯都是在这个基础构建的。
  • 相关阅读:
    PHP实现无限极分类
    html2canvas生成并下载图片
    一次线上问题引发的过程回顾和思考,以更换两台服务器结束
    Intellij IDEA启动项目报Command line is too long. Shorten command line for XXXApplication or also for
    mq 消费消息 与发送消息传参问题
    idea 创建不了 java 文件
    Java switch 中如何使用枚举?
    Collections排序
    在idea 设置 git 的用户名
    mongodb添加字段和创建自增主键
  • 原文地址:https://www.cnblogs.com/greywolf/p/2815507.html
Copyright © 2011-2022 走看看