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"); La sortie sera:
<ApplicationDelegate:10>Hello world
Maintenant, je veux également me déconnecter du nom de la méthode comme:
<ApplicationDelegate:applicationDidFinishLaunching:10>Hello world
Ainsi, cela rendrait notre débogage plus facile lorsque nous pouvons savoir quelle méthode est appelée. Je sais que nous avons également un débogueur Xcode mais parfois, je veux aussi faire du débogage en me déconnectant.
objective-c
c
iphone
debugging
vodkhang
la source
la source
iPhone
projet, je l'ai fait manuellement. J'adorerais voir la réponse à cela.Réponses:
Swift 3 et plus
la source
NSLog(@"%@", NSStringFromSelector(_cmd))
, si vous comptez utiliser_cmd
, car AFAIK Apple déclare_cmd
comme typeSEL
, pas une chaîne C. Ce n'est pas parce qu'il se trouve qu'il est implémenté en tant que chaîne C (à partir des versions actuelles de Mac OS X et de l'iPhone OS) que vous devez l'utiliser de cette manière, car Apple pourrait le changer dans une mise à jour du système d'exploitation.[self doSomething:arg1 somethingElse:arg2]
converties dans l'appel de fonction Cobjc_msgSend(self, "doSomething:somethingElse:, arg1, arg2);
. Le deuxième paramètre deobjc_msgSend()
prend unchar*
. Rappelez-vous que parce que le runtime Objective-C est dynamique, il utilise en fait une table de recherche pour déterminer quelle méthode sur quelle classe appeler, donc un char * est pratique car les méthodes sont représentées sous forme de chaînes dans la table de recherche.print("\(#function)")
Pour répondre techniquement à votre question, vous souhaitez:
Ou vous pouvez également faire:
la source
__FUNCTION__
et son assez équivalent étant également disponible dans les fonctions C.__FUNCTION__
inclut également le nom de la classetl; dr
Détails
Apple a une page de questions / réponses 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 aider à la journalisation:
_cmd
Comme d'autres réponses l'indiquent, pour obtenir simplement le nom de la méthode actuelle, appelez:
Pour obtenir le nom de la méthode actuelle et le numéro de ligne actuel, utilisez ces deux macros
__func__
et__LINE__
comme indiqué ici:Un autre exemple… Des extraits de code que je garde dans la bibliothèque d'extraits de code de Xcode:
… Et TRACE au lieu de ERROR…
… Et une plus longue utilisant une description codée en logiciel passant une valeur (
[rows count]
)…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.
Expressions pour la journalisation
Cadres de journalisation
Certains cadres de journalisation peuvent également aider à obtenir la méthode actuelle ou le numéro de ligne. Je ne suis pas sûr, car j'ai utilisé un excellent cadre de journalisation en Java ( SLF4J + LogBack ) mais pas Cocoa.
Consultez cette question pour obtenir des liens vers divers cadres de journalisation Cocoa.
Nom du sélecteur
Si vous avez une variable Selector (un SEL ), vous pouvez imprimer son nom de méthode ("message") de l'une des deux manières décrites dans ce billet de blog Codec :
NSLog(@"%@", NSStringFromSelector(selector) );
NSLog(@"%s", selector );
Ces informations sont tirées de la page de documentation Apple liée au 19/07/2013. Cette page a été mise à jour le 2011-10-04.
la source
sel_getName(SEL)
puisque SEL est un type opaque et peut ne pas toujours être unchar *
la source
C'est en fait aussi simple que:
Pour une raison quelconque, iOS permet à _cmd d'être passé en tant que caractère littéral sans même d'avertissement de compilation. Qui sait
la source
Dans Swift 4:
test func () {
}
test () // affiche la valeur "test ()"
la source