web-dev-qa-db-ja.com

現在のメソッドの名前または署名をNSStringに取り込む方法は?

例:メソッド-myFooBarMethod:withFoo:bar:moreFoo:があり、そのメソッドの実装内で、@"-myFooBarMethod:withFoo:bar:moreFoo:のような名前をNSStringに動的に取得したいと思います。メソッドシグネチャのハードタイピングはありません。

これはセレクターと関係があると思います。現在のメソッド(コードを実行するメソッド)の名前をNSStringとして取得するにはどうすればよいですか?

43
HelloMoon

すべてのメソッド呼び出しは、2つの隠し引数も渡します。idという名前のself_cmdという名前のSELです。 NSStringFromSelectorを使用して、メソッドセレクターをNSStringに変換できます。

NSStringFromSelector(_cmd);
95
Martin Gordon

__func__を使用します。これはC文字列であるため、NSStringの場合は[NSString stringWithUTF8String:__func__]を使用します。

これには、_cmdに比べて2つの利点があります。

  1. これは、Objective-Cメソッドだけでなく、C関数とC++メソッドでも機能します。 (実際、__func__はC99までに存在する必要があります。)
  2. Objective-Cメソッドでは、メソッドタイプ(クラスメソッドとインスタンスメソッド)、クラス名、およびセレクターが含まれます。たとえば、"-[MyView drawRect:]"です。
17
Peter Hosey

この種のものが役立つ場所の例として:これは私が使用するNSLogメッセージのテンプレートです:

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

これにより、ログ記録時にクラスとメソッドがコンソールにダンプされます。

7
Abizern

Martinの回答によると、 Objective C 2.0 Runtime の情報もお読みください。

ただし、このように内臓で遊ぶと、コードの管理が難しくなる傾向があります。

1
Adam Wright