2011-04-24 55 views
0

我知道如何使用:創建對象的SEL傳遞給它

[self method:object]; 

但是,它可能得到的這個SEL對象?

SEL method = @selector(method:object); 

不起作用。

謝謝:)

+1

選擇器只不過是方法簽名 - 它們不會與作爲參數傳遞的對象一起提供。你想達到什麼目的? – BoltClock 2011-04-24 02:11:26

+0

我需要得到一個選擇器的參考傳入它的對象 - 因爲使用[self method:object];不會削減它:( – 2011-04-24 02:12:24

+3

@BoltBlock選擇器不是真正的方法簽名,因爲它不會對類型進行編碼。更準確的定義是選擇器表示方法名稱。 – 2011-04-24 03:57:24

回答

6

一個SEL只是選擇 - 這是發送郵件的名稱。要捕獲該消息的特定實例,其參數和作爲對象的返回值,需要使用NSMethodSignatureNSInvocation。舉例來說,基於上述假想的-method:object

NSMethodSignature *sig = [SomeClass instanceMethodSignatureForSelector:@selector(method:)]; 
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:sig]; 

// Assume that someObject is an instance of SomeClass 
[inv setTarget:someObject]; 

// Assume an "id object" declared elsewhere. 
// Also note that self & _cmd are at indices 0 & 1, respectively 
[inv setArgument:&object atIndex:2] 

// Some time later... 
[inv invoke]; 

需要注意的是,因爲NSInvocation的是一個對象,它並沒有被立即調用。它可以存儲起來供以後使用,通常情況下 - 如果想立即發送消息,則發送消息的方法要簡單得多。例如,Cocoa的標準撤消/重做機制基於存儲和調用NSInvocations。

+0

這意味着[inv invoke];會調用該方法嗎? – 2011-04-24 05:22:55

+0

是的,完全相同 - 它會做相當於'[someObject method:object]'。 – 2011-04-24 05:27:32

0

@ selector是另一種方法或函數的東西。

拿這個爲例:

-(IBAction)timerStart { 
timer = [NSTimer scheduledTimerWithTimeInterval:2.0 
target:self 
selector:@selector(targetMethod:) 
userInfo:nil 
repeats:NO]; 
} 

-(void)targetMethod:(id)sender { 
[timer invalidate]; 
timer = nil; 
} 

正如你所看到的,選擇(targetMethod :)被調用到行動的NSTimer兩秒鐘運行後。 targetMethod:是一個(void)函數:(id)發送者,因此運行。

在你的情況,我認爲你要做到的是

[self performSelector:@selector(methodName:)]; 
+2

'withObject:'... – BoltClock 2011-04-24 02:43:00

相關問題