2011-01-23 33 views
4

該場景呈現自己,我有一個對象,存儲一個外部@選擇器供以後使用。按照設計,我希望能夠添加兩種選擇器。簡單的一個,沒有參數,比如[object add:@selector(doSomething)],更復雜的是一個參數,比如[object add:@selector(doSomething:)](介意冒號)。假設選擇器存儲在變量SEL mySelector中。如何確定@ selector是否需要參數?

在執行中,我需要在[anotherObject performSelector:mySelector][anotherObject performSelector:mySelector withObject:userInfo]]之間做出決定。

我執行此決定的方式是通過提供一個BOOL標誌來冗餘存儲性能是否應該帶或不帶額外參數。然而,雖然我無法在文檔中找到它,但我有這樣的感覺,我應該也可以詢問選擇器,如-(BOOL)needsParameter。我知道,例如,UIGestureRecognizer的addTarget:action:以某種方式自動進行這種區分。

難道有人指着我正確的方向嗎?

+1

可能的重複http://stackoverflow.com/questions/3571739/how-to-get-the-arity-of-a-method – Yuras 2011-01-23 13:11:08

+0

@Yuras:不錯的發現 – BoltClock 2011-01-23 13:13:28

回答

9

您可以使用NSMethodSignature類。例如,

SEL mySelector = …; 

NSMethodSignature *msig = [anotherObject methodSignatureForSelector:mySelector]; 
if (msig != nil) { 
    NSUInteger nargs = [msig numberOfArguments]; 
    if (nargs == 2) { // 0 non-hidden arguments 
    } 
    else if (nargs == 3) { // 1 non-hidden argument 
    } 
    else { 
    } 
} 

或者,你可以使用NSStringFromSelector()獲得的mySelector串表示和計算冒號的出現的次數。