十一: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
posted @ 2016-04-29 10:23  hissia  阅读(431)  评论(0编辑  收藏  举报