2009-09-03 2 views
42

Пример: У меня есть метод -myFooBarMethod:withFoo:bar:moreFoo: и внутри реализации этого метода я хочу динамически получить его имя, например @"-myFooBarMethod:withFoo:bar:moreFoo: в NSString. Нет жесткого ввода подписи метода.Как получить имя или подпись текущего метода в NSString?

Я чувствую, что это должно что-то сделать с помощью селекторов. Как я могу получить имя текущего метода (тот, который выполняет код) как NSString?

ответ

94

Каждый вызов метода также передает два скрытых аргумента: id с именем self и SEL с именем _cmd. Вы можете использовать NSStringFromSelector для преобразования выбора метода к NSString:

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:

  1. Он работает в функции C и C++ методы, а также методы Objective-C. (Фактически для C99 требуется существование __func__.)
  2. В методах Objective-C он включает в себя тип метода (метод класса против метода экземпляра) и имя класса, а также селектор. Например, "-[MyView drawRect:]".
Смежные вопросы