A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lijunyusmile 中级黑马   /  2016-7-12 00:12  /  1292 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

1 个回复

倒序浏览
这么详细啊啊 这块不好懂啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马