web-dev-qa-db-fra.com

NSLog le nom de la méthode avec Objective-C sur iPhone

Actuellement, nous définissons nous-mêmes un mécanisme de journal étendu pour imprimer le nom de la classe et le numéro de ligne source du journal. 

#define NCLog(s, ...) NSLog(@"<%@:%d> %@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], \
    __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__])

Par exemple, lorsque j'appelle NCLog (@ "Hello world"); .__, le résultat sera:

<ApplicationDelegate:10>Hello world

Maintenant, je veux aussi déconnecter le nom de la méthode comme:

<ApplicationDelegate:applicationDidFinishLaunching:10>Hello world

Cela facilitera donc le débogage lorsque nous saurons quelle méthode est appelée. Je sais que nous avons également un débogueur Xcode, mais parfois, je souhaite également procéder au débogage en me déconnectant.

142
vodkhang
print(__FUNCTION__) // Swift
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C

Swift 3 et plus

print(#function)
247
drawnonward

Pour répondre techniquement à votre question, vous souhaitez:

NSLog(@"<%@:%@:%d>", NSStringFromClass([self class]), NSStringFromSelector(_cmd), __LINE__);

Ou vous pouvez aussi faire:

NSLog(@"%s", __PRETTY_FUNCTION__);
157
Dave DeLong

tl; dr

NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );

Détails

Apple a une page de questions techniques: QA1669 - Comment puis-je ajouter des informations de contexte - telles que la méthode actuelle ou le numéro de ligne - à mes instructions de journalisation?

Pour vous aider à vous connecter:

  • Le préprocesseur C fournit quelques macros .
  • Objective-C fournit des expressions (méthodes).
    • Passez l'argument implicite pour le sélecteur de la méthode actuelle: _cmd

Comme d'autres réponses l'ont indiqué, pour obtenir simplement le nom de la méthode actuelle, appelez:

NSStringFromSelector(_cmd)

Pour obtenir le nom de la méthode actuelle and numéro de ligne actuel, utilisez ces deux macros __func__ et __LINE__ comme indiqué ici:

NSLog(@"%s:%d someObject=%@", __func__, __LINE__, someObject);

Un autre exemple… Des extraits de code que je garde dans la bibliothèque d'extraits de code de Xcode:

NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );

… Et TRACE au lieu de ERROR…

NSLog( @"TRACE %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );

… Et une version plus longue utilisant une description codée de manière douce en passant une valeur ([rows count])…

NSLog( @"TRACE %@ METHOD %s:%d.", [NSString stringWithFormat:@"'Table of Contents.txt' file's count of Linefeed-delimited rows: %u.", [rows count]] , __func__, __LINE__ );

Macros de préprocesseur pour la journalisation

Notez l'utilisation d'une paire de caractères de soulignement autour des deux côtés de la macro.

 | Macro | Format | Description 
 __Func__% s Signature de fonction actuelle 
 __LINE__% d Numéro de ligne actuel 
 __FILE__% s Chemin d'accès complet au fichier source 
 __PRETTY_FUNCTION__% s Comme __func__, mais inclut les commentaires 
 informations de type en code C++. 

Expressions pour la journalisation

 | Expression | Format | Description 
 NSStringFromSelector (_cmd)% @ Nom du sélecteur actuel 
 NSStringFromClass ([self class])% @ Nom de classe de l'objet actuel 
 [[NSString% @ Nom du fichier de code source 
 stringWithUTF8String: __ FILE__] 
 lastPathComponent] 
 [NSThread callStackSymbols]% @ NSArray de trace de pile 

Cadres de journalisation

Certains cadres de journalisation peuvent également vous aider à obtenir le numéro de méthode ou de ligne actuel. Je ne suis pas sûr, car j'ai utilisé un excellent cadre de journalisation dans Java ( SLF4J + LogBack ), mais pas Cocoa.

Voir cette question pour des liens vers divers cadres de journalisation Cocoa.

Nom du sélecteur

Si vous avez une variable Selector (a SEL ), vous pouvez imprimer le nom de sa méthode ("message") de deux manières, comme décrit par ceci Codec - article de blog :

  • Utilisation de l'appel d'Objective-C pour NSStringFromSelector :
    NSLog(@"%@", NSStringFromSelector(selector) );
  • En utilisant le droit C:
    NSLog(@"%s", selector );

Cette information est tirée de la Apple page doc liée du 19/07/2013. Cette page avait été mise à jour le 2011-10-04.

78
Basil Bourque
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C
print(__FUNCTION__) // Swift
8
Huynh Inc

C'est aussi simple que:

printf(_cmd);

Pour une raison quelconque, iOS permet à _cmd d'être transmis en tant que caractère littéral sans même qu'un avertissement de compilation. Qui sait

0
Albert Renshaw

Dans Swift 4:

func test () {

print(#function)

}

test () // affiche la valeur "test ()"

0
Ankit garg