Object-c 中的 SEL

來源:互聯網
上載者:User

標籤:style   color   io   os   使用   ar   for   檔案   sp   

SEL

在Objective-C中,SEL是選取器(selector)的一個類型。選取器就是指向方法的一個指標,讀者可以簡單理解為程式運行到這裡就會執行指定的方法,可以這樣定義一個選取器:

 
  1. SEL action = [button action]; 

我們這樣使用一個選取器,下面的選取器都叫做action:

 
  1. [Foo action]  
  2. [Bar action] 

在Target-Action 模式(Cocoa 程式中的一種常用模式)中:Target 指定了一個類,Action指定一個方法。在一個對象上設定Action就是通過選取器完成的:

 
  1. -(void)setTarget:(id)target;  
  2. -(void)setAction:(SEL)action; 

下述語句設定了一個button對象上的Action為“@selector(start:)”,即它調用start方法:

 
  1. [button setAction:@selector(start:)]; 

如果你的方法上有兩個參數,比如:

 
  1. -(void)setName:(NSString *)name age:(int)age; 

那麼,你的選取器應該這樣書寫:

 
  1. SEL sel = @selector(setName:age:); 

如果方法不存在的話,調用該方法的應用可能會異常中止。所以,需要使用respondsToSelector 方法來判斷該對象是否存在對應的方法,使用performSelector:withObject:方法來調用選取器:

 
  1. SEL sel = @selector (start:) ; // 指定action  
  2. if ([obj respondsToSelector:sel]) { //判斷該對象是否有相應的方法  
  3. [obj performSelector:sel withObject:self]; //調用選取器方法  

下面來看一個應用選取器的執行個體。

【例2-16】選取器執行個體。

 
  1. #import <Foundation/Foundation.h> 
  2. @interface ClassA : NSObject {  
  3. }  
  4. - (void) print;  
  5. @end  
  6. @implementation ClassA  
  7. - (void) print{  
  8. NSLog (@"I‘m ClassA.") ;  
  9. }  
  10. @end  
  11. int main (int argc, const char * argv[]) {  
  12. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  
  13. SEL sel = @selector (print) ;  
  14. ClassA *classA = [[ClassA alloc]init];  
  15. [classA performSelector:sel withObject:nil]; //調用選取器指定的方法  
  16. [pool drain];  
  17. return 0;  

【程式結果】

 
  1. I‘m ClassA. 

下面解釋一下這段代碼,讀者有可能看不明白,因為到目前為止並沒有講述類相關的知識。讀者只需要瞭解上述例子中選取器的用法即可,關於類的知識,會在後面的章節詳細闡述。

代碼首先建立了一個名字叫ClassA 的類,它只包含一個方法print。在隨後的實現檔案中,我們實現了這個方法:

 
  1. - (void) print{  
  2. NSLog (@"I‘m ClassA.") ;  

讀者不難看出,這個方法僅僅是列印到控制台上一句話。在接下來的main方法中,定義了一個選取器sel,它指向的是一個名叫print 的方法。我們並不知道這個方法是哪個類的,因為具體的資訊是在運行期間系統自動幫我們判斷的。

 
  1. SEL sel = @selector (print) ; 

隨後構建了一個對象(讀者不用拘泥於文法,我們會在後面的章節詳細闡述),並調用這個對象performSelector:withObject:的方法。

 
  1. ClassA *classA = [[ClassA alloc]init];  
  2. [classA performSelector:sel withObject:nil]; 

這時候,系統就會自動調用classA對象的print方法,最終得到程式運行結果

Object-c 中的 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.