Dans cette astuce, nous allons apprendre à personnaliser la sortie générée par NSLog afin de déboguer les programmes plus efficacement. Continuer à lire!
Par défaut, NSLog affiche les résultats au format suivant:
Date Time OurApp [] Sortie NSLog
Un exemple concret pourrait ressembler à ceci:
2013-08-03 00: 35: 53.038 TestApp [460: c07] Valeur du résultat = 20
La sortie par défaut est bonne, mais cela laisse à désirer. La plupart du temps, nous souhaitons voir les éléments suivants dans une instruction de journal:
En bref, nous aimerions que NSLog ressemble davantage à ceci:
(ClassName MethodName) (SourceFileName: LineNumber) Sortie NSLog
Voyons d'abord comment NSLog fonctionne sans modification. NSLog est juste une fonction C intégrée au framework de base de Cocoa et se comporte comme toute autre fonction C variadique. NSLog envoie des messages d’erreur à la fonction Apple System Log. Il le fait simplement en transmettant ses arguments à la fonction NSLogv..
NSLog n'étant qu'un wrapper pour NSLogv, nous pouvons redéfinir NSLog avec notre propre appel personnalisé à NSLogv. C'est exactement ce que je vais vous montrer comment faire dans ce tutoriel..
Créez un nouveau projet iOS dans Xcode, avec le Application vide modèle. Appeler ExtendNSLog. Cochez l'option pour le comptage automatique des références, mais décochez les options pour les données de base et les tests unitaires.
Créer un projet iOS avec le modèle d'application vide Le nom du produit doit être "ExtendNSLog"Créez maintenant un fichier d’en-tête avec le projet. Sélectionner Nouveau fichier> Objectif - Classe C. Définissez le nom de la classe sur ExtendNSLogFunctionality. qui sera une sous-classe de NSObject.
Créer un modèle de classe Objective C Définissez le nom de la classe sur ExtendNSLogFunctionalityOuvrir ExtendNSLogFunctionality.h et placez le code suivant dans l'en-tête:
#importation#ifdef DEBUG #define NSLog (args…) ExtendNSLog (__ FILE __, __ LINE __, __ PRETTY_FUNCTION __, args); #else #define NSLog (x…) #endif void ExtendNSLog (fichier const char *, int lineNumber, const char * nomFonction, format NSString *,…);
La condition ci-dessus définira un NSLog
instruction uniquement lorsque DEBUG est défini. Lorsque DEBUG n'est pas défini, l'instruction NSLog ne fera rien. La question se pose: comment contrôlez-vous quand DEBUG est défini? Cela peut être fait en affectant DEBUG = 1 dans les paramètres du préprocesseur pour votre projet..
Pour ce faire, cliquez sur votre cible d'application et sélectionnez l'onglet Paramètres de construction. Ensuite, assurez-vous que les options "Tous" et "Combiné" sont sélectionnées. Recherchez "prétraitement" et localisez la section intitulée "Macros de préprocesseur". Ensuite, ajoutez simplement "DEBUG = 1" à la section Debug.
Ajouter l'indicateur DEBUG = 1 aux paramètres du préprocesseurNotez que dans les modèles de projet Xcode plus récents, une macro DEBUG = 1 sera déjà définie pour la configuration de génération Debug dans la section Macros de préprocesseur. Pour plus d'informations, reportez-vous à ce post sur StackOverflow.
La macro de débogage étant définie, notre tâche suivante consiste à écrire la version personnalisée de NSLog. Ouvrez ExtendNSLogFunctionality.m et ajoutez le code suivant:
#import "ExtendNSLogFunctionality.h" void ExtendNSLog (const char * fichier, int lineNumber, const char * nom de fonction, format NSString *, ...) // Tapez pour contenir des informations sur les arguments variables. va_list ap; // Initialise une liste d'arguments variables. va_start (ap, format); // NSLog ajoute uniquement une nouvelle ligne à la fin du format NSLog si // il n'y en a pas déjà une. // Nous utilisons ici cette fonctionnalité de NSLog () if (! [Format hasSuffix: @ "\ n"]) format = [format stringByAppendingString: @ "\ n"]; NSString * body = [[NSString alloc] initWithFormat: arguments de format: ap]; // Fin en utilisant une liste d'arguments variables. va_end (ap); NSString * fileName = [[NSString stringWithUTF8String: fichier] lastPathComponent]; fprintf (stderr, "(% s) (% s:% d)% s", nomFonction, [nomFichier UTF8String], numéroLigne, [corps UTF8String]);
Maintenant, ajoutez l'inclusion ExtendNSLogFunctionality.h au fichier d'en-tête de préfixe Prefix.pch dans la section #ifdef __OBJC__.
#ifdef __OBJC__ #import#importation #import "ExtendNSLogFunctionality.h" #endif
Pour une meilleure compréhension des en-têtes de préfixes, consultez cette entrée sur Wikipedia. En ce qui concerne les meilleures pratiques pour les en-têtes de préfixes, consultez cette publication de StackOverflow.
Maintenant, ajoutez un NSLog n'importe où dans votre code de projet. Dans mon cas, je décide d’en ajouter un dans la méthode d’AppDelegate.m -Application (BOOL): application (UIApplication *) application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions
.
int résultat = 20; NSLog (@ "Valeur du résultat:% d", résultat);
Si vous construisez et exécutez le projet avec la configuration Debug maintenant, vous devriez voir quelque chose comme ceci:
(- [Application AppDelegate: didFinishLaunchingWithOptions:]) (AppDelegate.m: 21) Valeur du résultat: 20
À votre santé! Cette sortie est beaucoup plus utile que l’implémentation par défaut. Espérons que cette technique vous fera gagner beaucoup de temps lors du débogage de vos propres programmes.!