Recherche…


Syntaxe

  • NSLog (@ "text to log"); // Journal de texte de base
  • NSLog (@ "data:% f -% .2f", myFloat, anotherFloat); // Enregistrement du texte, y compris les nombres flottants.
  • NSLog (@ "data:% i", myInteger); // Enregistrement de texte incluant un nombre entier.
  • NSLog (@ "data:% @", myStringOrObject); // Enregistrement de texte faisant référence à une autre chaîne ou à un objet dérivé de NSObject.

Remarques

Pour la journalisation de différents types d'objets et de types de données, reportez-vous à: Objective-C, Spécificateurs de format

Enregistrement

NSLog(@"Log Message!");
NSLog(@"NSString value: %@", stringValue);
NSLog(@"Integer value: %d", intValue);

Le premier argument de NSLog est un NSString contenant le format du message de journal. Les autres paramètres sont utilisés comme valeurs pour remplacer les spécificateurs de format.

Le formatage fonctionne exactement comme printf , à l'exception du spécificateur de format supplémentaire %@ pour un objet Objective-C arbitraire. Ce:

NSLog(@"%@", object);

est équivalent à:

NSLog(@"%s", [object description].UTF8String);

NSLog vs printf

NSLog(@"NSLog message");
printf("printf message\n");

Sortie:

2016-07-16 08:58:04.681 test[46259:1244773] NSLog message
printf message

NSLog la date, l'heure, le nom du processus, l'ID du processus et l'ID du thread en plus du message de journal. printf que le message.

NSLog nécessite un NSString et ajoute automatiquement une nouvelle ligne à la fin. printf nécessite une chaîne C et n'ajoute pas automatiquement une nouvelle ligne.

NSLog envoie la sortie à stderr , printf envoie la sortie à stdout .


Certains format-specifiers dans printf vs NSLog sont différents. Par exemple, lorsque vous incluez une chaîne imbriquée, les différences suivantes sont à prévoir:

NSLog(@"My string: %@", (NSString *)myString);
printf("My string: %s", [(NSString *)myString UTF8String]);

Format de sortie NSLog

NSLog(@"NSLog message");

Le message qui est imprimé en appelant NSLog a le format suivant lorsqu'il est affiché dans Console.app:

Rendez-vous amoureux Temps Nom du programme ID du processus ID de fil Message
2016-07-16 08:58:04.681 test [46259 : 1244773] NSLog message

Enregistrement des valeurs variables

Vous ne devriez pas appeler NSLog sans une chaîne de format littérale comme celle-ci:

NSLog(variable);    // Dangerous code!

Si la variable n'est pas une NSString , le programme se NSLog , car NSLog attend une NSString .

Si la variable est une NSString , elle fonctionnera à moins que votre chaîne ne contienne un % . NSLog analysera la séquence % tant que spécificateur de format, puis lira une valeur de mémoire de la pile, provoquant un blocage ou même exécutant du code arbitraire .

Au lieu de cela, faites toujours le premier argument comme spécificateur de format, comme ceci:

NSLog(@"%@", anObjectVariable);
NSLog(@"%d", anIntegerVariable);

Le message vide n'est pas imprimé

Lorsque NSLog est invité à imprimer une chaîne vide, il omet complètement le journal.

NSString *name = @"";
NSLog(@"%@", name);  // Resolves to @""

Le code ci-dessus n'imprimera rien .

Il est recommandé de préfixer les journaux avec des étiquettes:

NSString *name = @"";
NSLog(@"Name: %@", name);  // Resolves to @"Name: "

Le code ci-dessus sera imprimé:

2016-07-21 14:20:28.623 App[87711:6153103] Name: 

Suppression des enregistrements de journal des versions de publication

Les messages imprimés à partir de NSLog sont affichés sur Console.app même dans la version de publication de votre application, ce qui n'a aucun sens pour les impressions qui ne sont utiles que pour le débogage. Pour résoudre ce problème, vous pouvez utiliser cette macro pour la journalisation du débogage au lieu de NSLog .

#ifdef DEBUG
#define DLog(...) NSLog(__VA_ARGS__)
#else
#define DLog(...)
#endif

Utiliser:

NSString *value = @"value 1";
DLog(@"value = %@", value);
// little known fact: programmers look for job postings in Console.app
NSLog(@"We're hiring!"); 

Dans les versions de débogage, DLog appellera NSLog . En version release, DLog ne fera rien.

Utiliser __FUNCTION __

NSLog(@"%s %@",__FUNCTION__, @"etc etc");

Insère le nom de la classe et de la méthode dans la sortie:

2016-07-22 12:51:30.099 loggingExample[18132:2971471] -[ViewController viewDidLoad] etc etc

Type NSLog et BOOL

Il n'y a pas de spécificateur de format pour imprimer le type booléen en utilisant NSLog. Une façon d’imprimer une valeur booléenne consiste à la convertir en chaîne.

BOOL boolValue = YES;
NSLog(@"Bool value %@", boolValue ? @"YES" : @"NO");

Sortie:

2016-07-30 22:53:18.269 Test[4445:64129] Bool value YES

Une autre façon d’imprimer une valeur booléenne consiste à la convertir en entier, en obtenant une sortie binaire (1 = oui, 0 = non).

BOOL boolValue = YES;
NSLog(@"Bool value %i", boolValue);

Sortie:

2016-07-30 22:53:18.269 Test[4445:64129] Bool value 1

Consignation des métadonnées NSLog

NSLog(@"%s %d %s, yourVariable: %@", __FILE__, __LINE__, __PRETTY_FUNCTION__, yourVariable);

Enregistre le fichier, le numéro de ligne et les données de fonction avec les variables que vous souhaitez consigner. Cela peut rendre les lignes de journal beaucoup plus longues, en particulier avec les noms de fichier et de méthode détaillés, mais cela peut aider à accélérer les diagnostics d'erreur.

Vous pouvez également emballer ceci dans une macro (stockez ceci dans un Singleton ou où vous en aurez le plus besoin);

#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);

Ensuite, lorsque vous souhaitez vous connecter, appelez simplement

ALog(@"name: %@", firstName);

Ce qui vous donnera quelque chose comme;

 -[AppDelegate application:didFinishLaunchingWithOptions:] [Line 27] name: John

Enregistrement en ajoutant à un fichier

NSLog est bon, mais vous pouvez également vous connecter en ajoutant un fichier à la place, en utilisant le code suivant:

NSFileHandle* fh = [NSFileHandle fileHandleForWritingAtPath:path];
if ( !fh ) {
    [[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil];
    fh = [NSFileHandle fileHandleForWritingAtPath:path];
}
if ( fh ) {
    @try {
        [fh seekToEndOfFile];
        [fh writeData:[self dataUsingEncoding:enc]];
    }
    @catch (...) {
    }
    [fh closeFile];
}


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow