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類型的數(shù)據(jù)
23 // 2.根據(jù)SEL數(shù)據(jù)找到對(duì)應(yīng)方法的地址
24 // 3.根據(jù)方法的地址調(diào)用對(duì)應(yīng)方法。
25
26 //[p performSelector:@selector(test2)]; // 通過(guò)sel去找方法地址
27
28 // 通過(guò)字符串調(diào)用方法,先將其轉(zhuǎn)換成SEL
29 NSString *name = @"test2";
30 SEL s = NSSelectorFromString(name);
31 [p performSelector:s];
32
33
34
35 // 發(fā)消息的本質(zhì),就是發(fā)送SEL,再根據(jù)SEL找到對(duì)應(yīng)方法的地址。
36 return 0;
37 }
38 // SEL
39 //
A方法與SEL的關(guān)系:
40 /*
41 1.每個(gè)類的方法列表都存儲(chǔ)在類對(duì)象中
42 2.每個(gè)方法都有一個(gè)與之對(duì)應(yīng)的SEL類型的數(shù)據(jù)
43 3.根據(jù)一個(gè)SEL數(shù)據(jù)就能夠找到方法的地址,從而調(diào)用方法、
44
45 SEL類型的定義:
46 typedef struct objc_selector *SEL;
47
48 B.SEL對(duì)象的創(chuàng)建:
49 SEL s = @selector(test);
50 SEL s2 = NSSelectorFromString(@"test");
51
52 C.SEL的其他用法:
53 每個(gè)方法內(nèi)部都有一個(gè)隱藏的SEL數(shù)據(jù)===》_cmd ===> 代表當(dāng)前方法對(duì)應(yīng)的SEL數(shù)據(jù)
54 NSStringFromSelector(_cmd) ===> 將SEL數(shù)據(jù)轉(zhuǎn)換成NSString
55 NSSelectorFromString("test2") ===> 把test2轉(zhuǎn)換成SEL類型的數(shù)據(jù)。
56
57 */