1 #import <Foundation/Foundation.h>
2 @interface Person : NSObject
3 - (void)test2;
4 @end
5
6 @implementation Person
7
8 - (void)test2
9 {
10 NSString *str = NSStringFromSelector(_cmd);
11 NSLog(@"%@", str);
12 }
13 @end
14
15 int main() {
16
17
18
19 Person *p = [[Person alloc] init];
20 //[p test2];
21
22 // 1.把test2包装成SEL类型的数据
23 // 2.根据SEL数据找到对应方法的地址
24 // 3.根据方法的地址调用对应方法。
25
26 //[p performSelector:@selector(test2)]; // 通过sel去找方法地址
27
28 // 通过字符串调用方法,先将其转换成SEL
29 NSString *name = @"test2";
30 SEL s = NSSelectorFromString(name);
31 [p performSelector:s];
32
33
34
35 // 发消息的本质,就是发送SEL,再根据SEL找到对应方法的地址。
36 return 0;
37 }
38 // SEL
39 //
A方法与SEL的关系:
40 /*
41 1.每个类的方法列表都存储在类对象中
42 2.每个方法都有一个与之对应的SEL类型的数据
43 3.根据一个SEL数据就能够找到方法的地址,从而调用方法、
44
45 SEL类型的定义:
46 typedef struct objc_selector *SEL;
47
48 B.SEL对象的创建:
49 SEL s = @selector(test);
50 SEL s2 = NSSelectorFromString(@"test");
51
52 C.SEL的其他用法:
53 每个方法内部都有一个隐藏的SEL数据===》_cmd ===> 代表当前方法对应的SEL数据
54 NSStringFromSelector(_cmd) ===> 将SEL数据转换成NSString
55 NSSelectorFromString("test2") ===> 把test2转换成SEL类型的数据。
56
57 */