一、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 } |
|