2011-01-23 4 views
4

シナリオは、後で使用するために外側の@セレクタを格納するオブジェクトがある場所で表示されます。設計上、2種類のセレクタを追加できるようにしたいと考えています。単純なものは、[object add:@selector(doSomething)]のようなパラメータなしで、[object add:@selector(doSomething:)](コロンを気にしてください)のような1つのパラメータでより複雑なものです。セレクタが変数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

+0

@Yuras:nice find – BoltClock

+0

非常に重複しています!私も今日、新しい言葉を学んだ、それは 'arity'です:)ありがとう! – 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'は少なくとも2つの引数を持ちます。なぜなら、' self'と '@ selector'が引数0と1を占めているからです。この例を' if(nargs == 2){...}に変更します。else if(nargs == 3 ){...} else {...} 'と動作します。ありがとう! – epologee

+0

心配する人は、あなたは私を大いに助けました!時には私はドキュメントからこの種のものを取り出すことができればと思っていますが、それは経験に付随するものだと思います... – epologee

関連する問題