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 */