黑马程序员技术交流社区

标题: OC中SEL你不可不知的知识点 [打印本页]

作者: lijunyusmile    时间: 2016-7-12 00:12
标题: OC中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-7-12 22:39
这么详细啊啊 这块不好懂啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2