2009-09-03 17 views
42

Esempio: ho un metodo -myFooBarMethod:withFoo:bar:moreFoo: e all'interno dell'implementazione di tale metodo voglio ottenere in modo dinamico il suo nome, ad esempio @"-myFooBarMethod:withFoo:bar:moreFoo: in una NSString. Non è stata eseguita una dattilografia della firma del metodo.Come ottenere il nome o la firma del metodo corrente in una NSString?

Sento che questo deve fare qualcosa con i selettori. Come posso ottenere il nome del metodo corrente (quello che esegue il codice) come NSString?

risposta

94

Ogni chiamata di metodo passa anche due argomenti nascosti: uno id denominato self e uno denominato _cmd. È possibile utilizzare NSStringFromSelector per convertire il selettore del metodo a un NSString:

NSStringFromSelector(_cmd); 
+12

È inoltre possibile utilizzare la macro ** '__PRETTY_FUNCTION__' **, che il preprocessore sostituisce con una stringa C (char *) del nome del metodo. Funziona anche per le funzioni C. –

+1

Non sapevo che esistesse una macro chiamata "__PRETTY_FUNCTION__". Lo adoro. Ora devo solo trovare una ragione per usarlo nel mio codice da qualche parte ... – GeneralMike

1

Come per la risposta di Martin, ma come si potrebbe anche leggere le informazioni Objective C 2.0 Runtime.

Giocare nelle viscere come questo tende a portare a un codice difficile da gestire, comunque.

+1

Ci sono volte però è valido. – Abizern

+0

Gli esempi di sviluppo propri di Apple lo utilizzano per la registrazione in questo modo: 'NSLog (@"% @ received% @ ", self, NSStringFromSelector (_cmd));' –

7

Come esempio di dove questo genere di cose è utile: Questo è un modello per i messaggi NSLog che uso:

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

Questa discariche la classe e il metodo per la console quando si accede.

16

Utilizzare __func__. Questa è una stringa C, quindi per una NSString, utilizzare [NSString stringWithUTF8String:__func__].

Questo ha due vantaggi rispetto _cmd:

  1. Funziona in funzioni C e metodi C++, nonché i metodi Objective-C. (In realtà, è necessario cheesista da C99.)
  2. Nei metodi Objective-C, include il tipo di metodo (metodo di classe rispetto al metodo di istanza) e il nome della classe e il selettore. Ad esempio, "-[MyView drawRect:]".
Problemi correlati