iOS開發 關於SEL的簡單總結

來源:互聯網
上載者:User

標籤:

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; 

 

【編輯精選】

  1. Android和iOS如何防禦惡意應用
  2. 探秘百度移動面試 iOS試題分享
  3. iOS7.1正式發布:加入CarPlay車載功能調整部分UI和bug
  4. 調查顯示開發人員對HTML5的興趣高於iOS?
  5. iOS基本記憶體管理:autorelease和autoreleasepool

iOS開發 關於SEL的簡單總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.