2009-09-03 12 views
42

例:私はメソッド-myFooBarMethod:withFoo:bar:moreFoo:を持っています。そのメソッドの実装の中で、NSStringに@"-myFooBarMethod:withFoo:bar:moreFoo:のような名前を動的に取得したいと思います。メソッドシグネチャのハードタイピングは不要です。現在のメソッドの名前またはシグネチャをNSStringに取得する方法は?

私はこれがセレクタで何かをしなければならないと感じます。現在のメソッド(コードを実行するメソッド)の名前をNSStringとしてどのように取得できますか?

答えて

94

すべてのメソッド呼び出しには、idという名前のselfSELという名前の_cmdという2つの隠し引数も渡されます。あなたはNSStringのにメソッドセレクタを変換するNSStringFromSelectorを使用することができます:マーティンの答えを1として

NSStringFromSelector(_cmd); 
+12

** '__PRETTY_FUNCTION__' **マクロを使用することもできます。このマクロは、プリプロセッサがメソッド名のC文字列(char *)で置き換えます。これはC関数でも機能します。 –

+1

私は '__PRETTY_FUNCTION__'というマクロがあることに気づいていませんでした。大好きです。今では私のコードでどこかでそれを使う理由を見つけなければなりません... – GeneralMike

1

ていますが、Objective C 2.0 Runtime情報を読むのが好きかもしれません。

このようにして遊ぶと、コードを管理するのが難しくなる傾向があります。

+1

それは有効ですが、時間があります。 – Abizern

+0

Appleの開発者の例では、このようにログに使用しています: 'NSLog(@"%@ received%@ "、self、NSStringFromSelector(_cmd));' –

7

この種のものが有用であるところの例として:これは私が使用してのNSLogメッセージのテンプレートです:

NSLog(@"%@ %@: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), @"A Message"); 

これは、ログインコンソールにクラスとメソッドをダンプします。

16

__func__を使用してください。これはCの文字列なので、NSStringの場合は[NSString stringWithUTF8String:__func__]を使用します。

これは_cmd上の2つの利点を有する:

  1. これは、C関数とC++方法ならびにObjective-Cの方法で動作します。
  2. Objective-Cメソッドでは、メソッドタイプ(クラスメソッドとインスタンスメソッド)とクラス名とセレクタが含まれています。たとえば、"-[MyView drawRect:]"となります。
関連する問題