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.
print(__FUNCTION__) // Swift
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C
Swift 3 et plus
print(#function)
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__);
NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );
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:
_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__ );
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++.
| 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
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.
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 :
NSLog(@"%@", NSStringFromSelector(selector) );
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.
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C
print(__FUNCTION__) // Swift
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
Dans Swift 4:
func test () {
print(#function)
}
test () // affiche la valeur "test ()"