2009-09-03 14 views
42

Przykład: Mam metodę -myFooBarMethod:withFoo:bar:moreFoo: i wewnątrz implementacji tej metody chcę dynamicznie uzyskać jej nazwę, np. @"-myFooBarMethod:withFoo:bar:moreFoo: w NSString. Bez twardego pisania podpisu metody.Jak uzyskać nazwę lub podpis aktualnej metody w NSString?

Uważam, że to musi coś zrobić z selektorami. Jak mogę uzyskać nazwę bieżącej metody (tej, która wykonuje kod) jako NSString?

Odpowiedz

94

Każde wywołanie metody przekazuje również dwa ukryte argumenty: id o nazwie self i SEL o nazwie _cmd. Można użyć NSStringFromSelector przekonwertować selektor metody do NSString:

NSStringFromSelector(_cmd); 
+12

Można również użyć makra ** '__PRETTY_FUNCTION__' **, które preprocesor zastępuje ciągiem C (char *) nazwy metody. Działa również dla funkcji C. –

+1

Nie wiedziałem, że istnieje makro o nazwie "__PRETTY_FUNCTION__". Kocham to. Teraz muszę po prostu znaleźć powód, żeby użyć go w moim kodzie gdzieś ... – GeneralMike

1

Jak na odpowiedź Marcina, ale można też przeczytać informację Objective C 2.0 Runtime.

Jednak granie w odwagę prowadzi do trudnego do zarządzania kodu.

+1

Są jednak razy ważne. – Abizern

+0

Własne przykłady deweloperów firmy Apple używają go do rejestrowania w następujący sposób: 'NSLog (@"% @ received% @ ", self, NSStringFromSelector (_cmd));' –

7

Jako przykład gdzie coś takiego jest przydatna: To jest szablon wiadomości NSLog że zastosowanie:

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

Ten zrzuca klasy i metody do konsoli po zalogowaniu.

16

Użyj __func__. To jest ciąg C, więc dla NSString użyj [NSString stringWithUTF8String:__func__].

Ma to dwie zalety w stosunku _cmd:

  1. to działa w funkcji C i C++, a także metod metod Objective-C. (Faktycznie, wymagane jest istnienie __func__ przez C99.)
  2. W metodach Objective-C zawiera on typ metody (metoda klasy względem metody instancji) oraz nazwę klasy, a także selektor. Na przykład: "-[MyView drawRect:]".
Powiązane problemy