2011-01-23 3 views
4

시나리오는 나중의 사용을 위해 외부 @selector를 저장하는 객체가있는 곳에서 자체적으로 나타납니다. 의도적으로 두 종류의 선택기를 추가 할 수 있기를 바랍니다. 매개 변수가없는 단순한 매개 변수는 [object add:@selector(doSomething)]과 같으며 매개 변수가 하나 인 복잡한 매개 변수는 [object add:@selector(doSomething:)] (콜론 사용)과 같습니다. 선택기가 변수 SEL mySelector에 저장되어 있다고 가정 해 보겠습니다.@selector에 매개 변수가 필요한지 확인하는 방법은 무엇입니까?

실행시에는 [anotherObject performSelector:mySelector] 또는 [anotherObject performSelector:mySelector withObject:userInfo]] 사이를 결정해야합니다.

이 결정을 구현 한 방식은 성능이 추가 매개 변수의 유무에 관계없이 중복 저장하는 BOOL 플래그를 제공하는 것입니다. 그러나 docs에서 이것을 찾을 수는 없지만, 나는 또한 selector에 -(BOOL)needsParameter과 같은 것을 물어볼 수 있어야한다는 생각이 들었다. 예를 들어, UIGestureRecognizer의 addTarget : action : 어떻게 든이 구분을 자동으로 수행합니다.

누군가 올바른 방향으로 나를 가리킬 수 있습니까?

+1

http://stackoverflow.com/questions/3571739/how-to-get-the-arity-of-a-method 가능한 복제본 – Yuras

+0

@Yuras : nice find – BoltClock

+0

매우 많은 속임수! 나는 또한 오늘 새로운 단어를 배웠습니다. 그것은'arity'입니다 :) Thank Yuras! – epologee

답변

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 { 
    } 
} 

또는, mySelector의 문자열 표현을 얻고 콜론 문자의 발생 수를 계산하는 NSStringFromSelector()를 사용할 수 있습니다.

+0

완벽한! NSMethodSignature는 내가 필요로하는 것이고, 당신이 제공 한 예제는 내기에서 거의 작동합니다. 'NSMethodSignature'는 최소한 두 개의 인자를 가지게 될 것입니다. 왜냐하면'self '와'@ selector'가 인자 0과 1을 차지하기 때문입니다. 예제를'if (nargs == 2) {...}로 변경하십시오. else if (nargs == 3) {...} else {...}'그리고 그것은 작동합니다. 감사! – epologee

+0

걱정할 필요가없는 남자, 당신은 저를 도왔습니다! 때로는 문서에서 이런 종류의 것을 추출 할 수 있었으면 좋겠지 만 경험과 함께 제공되는 것 같아요. – epologee

관련 문제