偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

iOS開(kāi)發(fā) 關(guān)于SEL的簡(jiǎn)單總結(jié)

移動(dòng)開(kāi)發(fā) iOS
SEL就是對(duì)方法的一種包裝。包裝的SEL類型數(shù)據(jù)它對(duì)應(yīng)相應(yīng)的方法地址,找到方法地址就可以調(diào)用方法。在內(nèi)存中每個(gè)類的方法都存儲(chǔ)在類對(duì)象中,每個(gè)方法都有一個(gè)與之對(duì)應(yīng)的SEL類型的數(shù)據(jù),根據(jù)一個(gè)SEL數(shù)據(jù)就可以找到對(duì)應(yīng)的方法地址,進(jìn)而調(diào)用方法。

[[109777]]

  1. @interface Person : NSObject 
  2.  
  3. + (void)test1; 
  4. - (void)test2; 
  5. @end 
  6.  
  7.     // 根據(jù).h文件中定義的Person類和方法 執(zhí)行完這行代碼 在內(nèi)存中如下 
  8.     Person *person = [[Person alloc] init]; 

SEL就是對(duì)方法的一種包裝。包裝的SEL類型數(shù)據(jù)它對(duì)應(yīng)相應(yīng)的方法地址,找到方法地址就可以調(diào)用方法

1.方法的存儲(chǔ)位置

  • 在內(nèi)存中每個(gè)類的方法都存儲(chǔ)在類對(duì)象中
  • 每個(gè)方法都有一個(gè)與之對(duì)應(yīng)的SEL類型的數(shù)據(jù)
  • 根據(jù)一個(gè)SEL數(shù)據(jù)就可以找到對(duì)應(yīng)的方法地址,進(jìn)而調(diào)用方法
  • SEL類型的定義:  typedef struct objc_selector *SEL

2.SEL對(duì)象的創(chuàng)建

  1. SEL s1 = @selector(test1);   // 將test1方法包裝成SEL對(duì)象  
  2. SEL s2 = NSSelectorFromString(@"test1");   // 將一個(gè)字符串方法轉(zhuǎn)換成為SEL對(duì)象 

3.SEL對(duì)象的其他用法

  1. // 將SEL對(duì)象轉(zhuǎn)換為NSString對(duì)象   
  2. NSString *str = NSStringFromSelector(@selector(test)); 
  3.  
  4.  Person *p = [Person new]; 
  5.  
  6. // 調(diào)用對(duì)象p的test方法 
  7. [p performSelector:@selector(test)];
  1. /******************************* Person.h文件 **********************************/ 
  2.  
  3. #import <Foundation/Foundation.h> 
  4.  
  5. @interface Person : NSObject 
  6.  
  7. - (void)test1; 
  8.  
  9. - (void)test2:(NSString *)str; 
  10.  
  11. @end 
  12.  
  13. /******************************* Person.m文件 **********************************/ 
  14.  
  15. #import "Person.h" 
  16.  
  17. @implementation Person 
  18.  
  19. - (void)test1 
  20.     NSLog(@"無(wú)參數(shù)的對(duì)象方法"); 
  21.  
  22. - (void)test2:(NSString *)str 
  23.     NSLog(@"帶有參數(shù)的方法%@",str); 
  24. @end 
  25.  
  26. /******************************* main.m文件 **********************************/ 
  27.  
  28. #import "Person.h" 
  29. #import <Foundation/Foundation.h> 
  30.  
  31. /* 
  32.  調(diào)用方法有兩種方式: 
  33.  1.直接通過(guò)方法名來(lái)調(diào)用 
  34.  2.間接的通過(guò)SEL數(shù)據(jù)來(lái)調(diào)用 
  35.  */ 
  36.  
  37. int main(int argc, const char * argv[]) 
  38.     Person *person = [[Person alloc] init]; 
  39.      
  40.     // 1.執(zhí)行這行代碼的時(shí)候會(huì)把test2包裝成SEL類型的數(shù)據(jù) 
  41.     // 2.然后根據(jù)SEL數(shù)據(jù)找到對(duì)應(yīng)的方法地址(比較耗性能但系統(tǒng)會(huì)有緩存) 
  42.     // 3.在根據(jù)方法地址調(diào)用對(duì)應(yīng)的方法 
  43.      
  44.     [person test1]; 
  45.      
  46.     // 將方法直接包裝成SEL數(shù)據(jù)類型來(lái)調(diào)用 withObject:傳入的參數(shù) 
  47.     [person performSelector:@selector(test1)]; 
  48.     [person performSelector:@selector(test2:) withObject:@"傳入?yún)?shù)"]; 
  49.      
  50.     return 0; 

 

責(zé)任編輯:閆佳明 來(lái)源: cnblogs
相關(guān)推薦

2014-06-10 13:44:58

iOSUIImage知識(shí)點(diǎn)

2011-05-11 10:02:37

iOS

2013-06-03 16:27:49

iOS開(kāi)發(fā)移動(dòng)應(yīng)用移動(dòng)開(kāi)發(fā)

2013-09-12 15:37:09

iOS開(kāi)發(fā)流程

2011-08-31 10:26:38

MTK驅(qū)動(dòng)開(kāi)發(fā)

2017-04-12 10:04:18

Scrum實(shí)踐終結(jié)

2017-08-24 14:11:20

iOSSocial FramOpenShare

2011-09-02 19:12:59

IOS應(yīng)用Sqlite數(shù)據(jù)庫(kù)

2017-09-06 12:42:45

AndroidGradle開(kāi)發(fā)技巧

2013-01-06 09:52:43

SQLite

2013-04-09 16:04:06

iOS開(kāi)發(fā)SQLite知識(shí)總結(jié)

2011-08-05 10:13:45

iPhone開(kāi)發(fā)工具 Cocoa Xcode

2013-04-01 17:05:28

2017-01-19 21:45:27

iOS開(kāi)發(fā)者賬號(hào)

2017-11-06 16:00:05

iOS安卓發(fā)送原圖

2010-08-05 13:58:33

NFS故障

2011-08-18 11:19:13

IOS開(kāi)發(fā)Core Plot S

2018-07-12 11:44:38

數(shù)據(jù)庫(kù)MySQL變量分類

2015-09-09 10:20:00

php緩存技術(shù)

2017-04-26 15:30:31

PHP錯(cuò)誤機(jī)制
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)