標籤:style color io os 使用 ar for 檔案 sp
SEL
在Objective-C中,SEL是選取器(selector)的一個類型。選取器就是指向方法的一個指標,讀者可以簡單理解為程式運行到這裡就會執行指定的方法,可以這樣定義一個選取器:
- SEL action = [button action];
我們這樣使用一個選取器,下面的選取器都叫做action:
- [Foo action]
- [Bar action]
在Target-Action 模式(Cocoa 程式中的一種常用模式)中:Target 指定了一個類,Action指定一個方法。在一個對象上設定Action就是通過選取器完成的:
- -(void)setTarget:(id)target;
- -(void)setAction:(SEL)action;
下述語句設定了一個button對象上的Action為“@selector(start:)”,即它調用start方法:
- [button setAction:@selector(start:)];
如果你的方法上有兩個參數,比如:
- -(void)setName:(NSString *)name age:(int)age;
那麼,你的選取器應該這樣書寫:
- SEL sel = @selector(setName:age:);
如果方法不存在的話,調用該方法的應用可能會異常中止。所以,需要使用respondsToSelector 方法來判斷該對象是否存在對應的方法,使用performSelector:withObject:方法來調用選取器:
- SEL sel = @selector (start:) ; // 指定action
- if ([obj respondsToSelector:sel]) { //判斷該對象是否有相應的方法
- [obj performSelector:sel withObject:self]; //調用選取器方法
- }
下面來看一個應用選取器的執行個體。
【例2-16】選取器執行個體。
- #import <Foundation/Foundation.h>
- @interface ClassA : NSObject {
- }
- - (void) print;
- @end
- @implementation ClassA
- - (void) print{
- NSLog (@"I‘m ClassA.") ;
- }
- @end
- int main (int argc, const char * argv[]) {
- NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
- SEL sel = @selector (print) ;
- ClassA *classA = [[ClassA alloc]init];
- [classA performSelector:sel withObject:nil]; //調用選取器指定的方法
- [pool drain];
- return 0;
- }
【程式結果】
- I‘m ClassA.
下面解釋一下這段代碼,讀者有可能看不明白,因為到目前為止並沒有講述類相關的知識。讀者只需要瞭解上述例子中選取器的用法即可,關於類的知識,會在後面的章節詳細闡述。
代碼首先建立了一個名字叫ClassA 的類,它只包含一個方法print。在隨後的實現檔案中,我們實現了這個方法:
- - (void) print{
- NSLog (@"I‘m ClassA.") ;
- }
讀者不難看出,這個方法僅僅是列印到控制台上一句話。在接下來的main方法中,定義了一個選取器sel,它指向的是一個名叫print 的方法。我們並不知道這個方法是哪個類的,因為具體的資訊是在運行期間系統自動幫我們判斷的。
- SEL sel = @selector (print) ;
隨後構建了一個對象(讀者不用拘泥於文法,我們會在後面的章節詳細闡述),並調用這個對象performSelector:withObject:的方法。
- ClassA *classA = [[ClassA alloc]init];
- [classA performSelector:sel withObject:nil];
這時候,系統就會自動調用classA對象的print方法,最終得到程式運行結果
Object-c 中的 SEL