文章出處

SEL就是對方法的一種包裝。包裝的SEL類型數據它對應相應的方法地址,找到方法地址就可以調用方法。在內存中每個類的方法都存儲在類對象中,每個方法都有一個與之對應的SEL類型的數據,根據一個SEL數據就可以找到對應的方法地址,進而調用方法。
  1. @interface Person : NSObject 
  2.  
  3. + (void)test1; 
  4. - (void)test2; 
  5. @end 
  6.  
  7.     // 根據.h文件中定義的Person類和方法 執行完這行代碼 在內存中如下 
  8.     Person *person = [[Person alloc] init]; 

SEL就是對方法的一種包裝。包裝的SEL類型數據它對應相應的方法地址,找到方法地址就可以調用方法

1.方法的存儲位置

  • 在內存中每個類的方法都存儲在類對象中
  • 每個方法都有一個與之對應的SEL類型的數據
  • 根據一個SEL數據就可以找到對應的方法地址,進而調用方法
  • SEL類型的定義:  typedef struct objc_selector *SEL

2.SEL對象的創建

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

3.SEL對象的其他用法

  1. // 將SEL對象轉換為NSString對象 
  2. NSString *str = NSStringFromSelector(@selector(test)); 
  3.  
  4.  Person *p = [Person new]; 
  5.  
  6. // 調用對象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(@"無參數的對象方法"); 
  21.  
  22. - (void)test2:(NSString *)str 
  23.     NSLog(@"帶有參數的方法%@",str); 
  24. @end 
  25.  
  26. /******************************* main.m文件 **********************************/ 
  27.  
  28. #import "Person.h" 
  29. #import <Foundation/Foundation.h> 
  30.  
  31. /* 
  32.  調用方法有兩種方式: 
  33.  1.直接通過方法名來調用 
  34.  2.間接的通過SEL數據來調用 
  35.  */ 
  36.  
  37. int main(int argc, const char * argv[]) 
  38.     Person *person = [[Person alloc] init]; 
  39.      
  40.     // 1.執行這行代碼的時候會把test2包裝成SEL類型的數據 
  41.     // 2.然后根據SEL數據找到對應的方法地址(比較耗性能但系統會有緩存) 
  42.     // 3.在根據方法地址調用對應的方法 
  43.      
  44.     [person test1]; 
  45.      
  46.     // 將方法直接包裝成SEL數據類型來調用 withObject:傳入的參數 
  47.     [person performSelector:@selector(test1)]; 
  48.     [person performSelector:@selector(test2:) withObject:@"傳入參數"]; 
  49.      
  50.     return 0; 

 

【編輯推薦】


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()