2008-11-18 55 views
53

我有一個代碼示例,會從當前對象的SEL創建從一個方法名稱的選擇與參數

SEL callback = @selector(mymethod:parameter2); 

而且我有喜歡

-(void)mymethod:(id)v1 parameter2;(NSString*)v2 { 
} 

的方法現在,我需要將mymethod移動到另一個對象,如myDelegate

我曾嘗試:

SEL callback = @selector(myDelegate, mymethod:parameter2); 

,但它不會編譯。

+2

@Jim Puls--這實際上是一個Objective-C問題......對於可可或Cocoa-touch而言,它並不是特定於iPhone-sdk。此外,我們正在與objectivec標籤這些天:)目標c :) – 2008-11-18 02:57:28

回答

95

SEL是一種表示Objective-C中選擇器的類型。 @selector()關鍵字返回您描述的SEL。它不是一個函數指針,你不能傳遞任何對象或任何類型的引用。對於選擇器(方法)中的每個變量,必須在對@selector的調用中表示該變量。例如:

-(void)methodWithNoParameters; 
SEL noParameterSelector = @selector(methodWithNoParameters); 

-(void)methodWithOneParameter:(id)parameter; 
SEL oneParameterSelector = @selector(methodWithOneParameter:); // notice the colon here 

-(void)methodWIthTwoParameters:(id)parameterOne and:(id)parameterTwo; 
SEL twoParameterSelector = @selector(methodWithTwoParameters:and:); // notice the parameter names are omitted 

選擇器通常通過委派方法和回調來指定該方法應的特定對象上的回調過程中被調用。例如,當您創建一個計時器,回調方法具體定義爲:

-(void)someMethod:(NSTimer*)timer; 

所以,當你計劃你可以使用@selector來指定哪些方法您的對象實際上將負責回調的計時器:

@implementation MyObject 

-(void)myTimerCallback:(NSTimer*)timer 
{ 
    // do some computations 
    if(timerShouldEnd) { 
     [timer invalidate]; 
    } 
} 

@end 

// ... 

int main(int argc, const char **argv) 
{ 
    // do setup stuff 
    MyObject* obj = [[MyObject alloc] init]; 
    SEL mySelector = @selector(myTimerCallback:); 
    [NSTimer scheduledTimerWithTimeInterval:30.0 target:obj selector:mySelector userInfo:nil repeats:YES]; 
    // do some tear-down 
    return 0; 
} 

在這種情況下,您指定每隔30秒用myTimerCallback向對象obj發送消息。

16

您不能在@selector()中傳遞參數。

它看起來像你試圖實現回調。要做到這一點,最好的辦法是這樣的:

[object setCallbackObject:self withSelector:@selector(myMethod:)]; 

然後在你的對象setCallbackObject:withSelector:方法:你可以打電話給你的回調方法。

-(void)setCallbackObject:(id)anObject withSelector:(SEL)selector { 
    [anObject performSelector:selector]; 
} 
+0

這也不是純粹的iPhone。您可能想閱讀Apple的文檔「Obective-C 2.0編程語言」,可以在這裏找到http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/chapter_1_section_1.html – 2008-11-18 02:43:10

+4

要調用選擇器需要調用: [anObject performSelector:selector]; – 2009-07-23 19:42:20

5

除了已經說過的選擇器之外,你可能想看看NSInvocation類。

NSInvocation是一個呈現靜態的Objective-C消息,也就是說,它是一個轉換成對象的動作。 NSInvocation對象用於在對象之間和應用程序之間存儲和轉發消息,主要由NSTimer對象和分佈式對象系統來完成。

NSInvocation對象包含Objective-C消息的所有元素:目標,選擇器,參數和返回值。每個元素都可以直接設置,並且在調度NSInvocation對象時自動設置返回值。

請記住,雖然它在某些情況下很有用,但在正常編碼日不使用NSInvocation。如果你只是想讓兩個對象相互交談,可以考慮定義一個非正式或正式的委託協議,或者像前面提到的那樣傳遞一個選擇器和目標對象。

相關問題