2011-05-12 9 views
2

NSObjectのperformSelectorメソッドを使用して、実行時に決定された可変文字列に基づいてメソッドを呼び出しています。performSelectorにnilを渡す

[self performSelector:NSSelectorFromString(methodName)]; 

メソッド呼び出しがループ内にあります。しかし、いくつかのループ反復では、私は何もしたくないし、methodNameはゼロかもしれない。 performSelectorメッセージは引数としてnilをとらないようです。 performSelectorが何らかのアクションを実行しないようにしたい場合、私は何ができますか?

編集: 私はより明確にされている必要があります。今のところ、私はmethodName = @"doNothing"を設定しています - それは名前が意味するものです - 私はそれがゼロになりたいときです。私は、これよりも洗練された解決方法があるかどうかを知りたいのである。 私の質問は - だと思いますか?null型のセレクタはありますか?

答えて

6

-

if ([self respondsToSelector:NSSelectorFromString(methodName)]) { 
    [self performSelector:NSSelectorFromString(methodName)]; 
} 
+0

'methodName'が有効なメソッドを表していない場合、この回答はクラッシュしないので、他のものよりも適切です。 – Vasu

12

nilかどうかを確認しますか?

あなたがこれを探している可能性があり
SEL selector = NSSelectorFromString(methodName); 
if (selector != nil) { 
    [self performSelector:selector]; 
} 
+0

はあなたに感謝します。私はこれを考えました。私は質問したことを言い換えるために質問を編集しました... – windson

+0

Daveのバージョンはメソッド名ではなくセレクタをチェックするので、私よりも優れています。 methodNameが非nilでセレクタにはマッピングされないのに対し、mine(methodName!= nilをチェックする)はNSInvalidArgumentExceptionをスローしますが、コードは正常に動作します。 – Caleb

+1

このコードはクラッシュする可能性があります。そうじゃない? 'methodName'が実際のメソッドを表現していないが、UTF-8に変換できるヌル文字列でない場合を考えてみましょう。その場合、 'セレクタ'はゼロにはなりませんが、アプリケーションは 'セレクタに送られたセレクタが認識できないため 'クラッシュします。 – Vasu

5
if (methodName != nil) { 
    [self performSelector:NSSelectorFromString(methodName)]; 
} 
+0

ありがとうございます。私はこれを考えました。私は質問した内容を言い換えて質問を編集しました... – windson

+0

セレクタを実行するのではなく、-performSelectorの原因となるセレクタ名を探していますか?明らかに2つの選択肢があります:1)-performSelector:を呼び出す前にnilまたは何らかの特別な名前をチェックする、または2)何もしないメソッドを実装し、何も起こりたくないときにそのメソッドの名前を使用する。最初のオプションは、コードがあなたが実際に意図している意味を伝えるので、より良い選択、IMOのようです。 2番目の選択肢は、卑劣でエラーが発生しやすく、常に悪いことです。 – Caleb

+0

あなたはそれをそのように置く:... – windson

関連する問題