• 十一:SEL类型


    一、SEL类型基本概念

    1、SEL(selector)就是对方法的一种包装。包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法。

    找方法的过程:

    (1)首先把test这个方法名包装成sel类型的数据。

    (2)其次根据SEL数据找到对应的方法地址。

    (3)最后根据方法地址调用相应的方法。

    注:在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用。

    二、SEL类型的作用

    详细见代码:

     1 #import <Foundation/Foundation.h>
     2 @interface Person : NSObject
     3 - (void)sleep;
     4 - (void)eat:(NSString *)food;
     5 @end
     6 @implementation Person
     7 - (void)sleep
     8 {
     9     NSString *str = NSStringFromSelector(_cmd);//此处的_cmd相当于@select(sleep)
    10     NSLog(@"人喜欢睡觉  %@",str);
    11 }
    12 - (void)eat:(NSString *)food
    13 {
    14     NSLog(@"人喜欢吃%@",food);
    15 }
    16 
    17 @end
    18 int main(int argc, const char * argv[]) {
    19     @autoreleasepool {
    20         Person *p = [[Person alloc] init];
    21         //1、将eat方法包装成SEL对象
    22         SEL sel = @selector(sleep);
    23         //p对象是否实现了eat方法
    24         BOOL flag = [p respondsToSelector:sel];
    25         NSLog(@"flag: %d",flag);
    26         
    27         
    28         //2、间接的调用eat和eat:方法,最多可以传两个参数!
    29         [p performSelector:@selector(sleep)];
    30         [p performSelector:@selector(eat:) withObject:@"麻辣烫"];
    31         //上面的方法都可以先创建SEL sel1 = @selector(eat:);但是代入之后会警告PerformSelector may cause a leak because its selector is unknown! 去除警告的方法详见http://www.tuicool.com/articles/iu6zuu
    32         
    33         //3、如只知道字符串是Person方法时
    34         NSString *name = @"sleep";
    35         [p performSelector:NSSelectorFromString(name)];
    36         
    37     }
    38     return 0;
    39 }

    打印的结果:

    2016-04-29 10:19:31.389 SEL[10053:1696298] flag: 1
    2016-04-29 10:19:31.392 SEL[10053:1696298] 人喜欢睡觉  sleep
    2016-04-29 10:19:31.392 SEL[10053:1696298] 人喜欢吃麻辣烫
    2016-04-29 10:19:31.392 SEL[10053:1696298] 人喜欢睡觉  sleep
    Program ended with exit code: 0
  • 相关阅读:
    location.replace与location.href,location.reload的区别
    JavaScript 中 this 的用法
    setTimeout 的用法
    ngRoute 和 ui.router 的使用方法和区别
    js正则匹配只能输入有效数字可加小数点
    正则表达式
    关于浮动与清除浮动
    当给一个元素的宽度设置为百分比的时候,百分比的计算值是由它的直接父级元素的宽度决定
    内联(行级)元素不能设置margin-top
    JS判断数据是否是JSON类型
  • 原文地址:https://www.cnblogs.com/hissia/p/5445365.html
Copyright © 2020-2023  润新知