2010-04-22 16 views
13

Sto provando a eseguire il debug di un'app per iPhone su cui sto lavorando, e l'idea di aggiungere cinquanta istruzioni NSLog ai vari file sorgente mi dà i brividi.Un modo per chiedere un metodo per il suo nome?

Quello che mi piacerebbe fare è scrivere un paio di dichiarazioni, dicono

NSString *methodName = [self methodName]; 
NSLog(@"%@", methodName); 

che io posso solo incollare in ogni metodo che ho bisogno di. C'è un modo per fare questo? Esiste un costrutto Objective-C per chiedere un metodo per il suo nome? O dovrò farlo nel modo più duro?

+0

Questo è un duplicato esatto di http://stackoverflow.com/questions/2687785/any-way-to-ask-a-method-for-its-name/2687873#2687873 che ha una risposta più completa. – Ken

+0

@Ken So che sono trascorsi cinque anni ma penso che il tuo link non sia corretto. Dovrebbe puntare a http://stackoverflow.com/questions/969130/how-to-print-out-the-method-name-and-line-number-and-conditionally-disable-nslog?lq=1 –

risposta

22

Prova NSLog(@"%s", __func__). Questo stampa una bella descrizione, come -[MyView drawRect:].

Funziona anche con le funzioni. È una funzione del compilatore.

+2

'__func__' è una funzione del linguaggio C99. I suoi cugini '__FUNCTION__' e' __PRETTY_FUNCTION__' sono estensioni della lingua fornite da GCC e possibilmente da altri compilatori. Tutte e tre sono, credo, estensioni del linguaggio C++. –

+0

Esatto dupo di http://stackoverflow.com/questions/2687785/any-way-to-ask-a-method-for-its-name/2687873#2687873 – Ken

11

Usa: NSLog("%@", NSStringFromSelector(_cmd));

_cmd è una variabile speciale passata a ogni metodo, proprio come self che è un riferimento al selettore che ha causato il metodo da richiamare (sostanzialmente nome e la firma del metodo).

+1

'NSLog ("% s", _cmd); ' Un SEL è una stringa C. – drawnonward

+6

@drawnonward sì è tecnicamente, ma è comunque buono usare le funzioni di conversione appropriate. –

+9

@drawnonward: È implementato come uno, sì, ma definito come un tipo opaco. Apple è infame per aver scambiato cose del genere da te, quindi usalo come documentato indipendentemente da come è effettivamente implementato. –

2

Questo è ciò che si vuole:

NSLog(@"%s", __PRETTY_FUNCTION__); 

Per ulteriori informazioni su roba di registrazione correlata, rileggere le risposte a questa domanda: How to print out the method name and line number and conditionally disable NSLog?

+1

'__func__' fa la stessa cosa (in tutti i Mac attuali Compilatori OS X) ed è garantito che esistano da C99. Inoltre, non usare '% @', poiché sia ​​'__PRETTY_FUNCTION__' che' __func__' sono stringhe C, non oggetti NSString. –

+0

Grazie per aver segnalato l'errore% @ (ho corretto l'errore ora). '__func__' restituisce la stessa cosa di' __PRETTY_FUNCTION__' per i metodi Obj-C, le funzioni C e le funzioni C++? Pensavo che "__PRETTY_FUNCTION__" fornisse maggiori informazioni sulle funzioni C, come i nomi dei parametri o qualcosa del genere? –

+0

Entrambi gli identificatori hanno lo stesso valore nei metodi Objective-C ('- [MyClass selector]') e le funzioni C ('nameoffunc') in GCC 4.2.1 e Clang. Non ho testato C++, perché non conosco il C++ .. –

4

Io uso le seguenti macro di frequente:

#if DEBUG 
# define LOG(format, args ...) fprintf(stderr, format "\n", ## args) 
# ifdef __cplusplus 
# define ERR(format, args ...) fprintf(stderr, "[%s] (%s:%i): " format "\n", __PRETTY_FUNCTION__, __FILE__, __LINE__, ## args) 
# else 
# define ERR(format, args ...) fprintf(stderr, "[%s] (%s:%i): " format "\n", __func__, __FILE__, __LINE__, ## args) 
# endif 
#else 
# define LOG(format, args ...) 
# define ERR(format, args ...) 
#endif 

Se si desidera sempre il nome della funzione, è possibile adattarli facilmente secondo necessità.

Problemi correlati