我知道如何使用:創建對象的SEL傳遞給它
[self method:object];
但是,它可能得到的這個SEL對象?
SEL method = @selector(method:object);
不起作用。
謝謝:)
我知道如何使用:創建對象的SEL傳遞給它
[self method:object];
但是,它可能得到的這個SEL對象?
SEL method = @selector(method:object);
不起作用。
謝謝:)
一個SEL
只是選擇 - 這是發送郵件的名稱。要捕獲該消息的特定實例,其參數和作爲對象的返回值,需要使用NSMethodSignature和NSInvocation。舉例來說,基於上述假想的-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。
這意味着[inv invoke];會調用該方法嗎? – 2011-04-24 05:22:55
是的,完全相同 - 它會做相當於'[someObject method:object]'。 – 2011-04-24 05:27:32
@ 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:)];
'withObject:'... – BoltClock 2011-04-24 02:43:00
選擇器只不過是方法簽名 - 它們不會與作爲參數傳遞的對象一起提供。你想達到什麼目的? – BoltClock 2011-04-24 02:11:26
我需要得到一個選擇器的參考傳入它的對象 - 因爲使用[self method:object];不會削減它:( – 2011-04-24 02:12:24
@BoltBlock選擇器不是真正的方法簽名,因爲它不會對類型進行編碼。更準確的定義是選擇器表示方法名稱。 – 2011-04-24 03:57:24