Zoeken…


Syntaxis

  • NSLog (@ "te loggen tekst"); // Eenvoudig tekstlogboek
  • NSLog (@ "data:% f -% .2f", myFloat, anotherFloat); // Loggingstekst inclusief floatnummers.
  • NSLog (@ "data:% i", myInteger); // Loggingstekst inclusief geheel getal.
  • NSLog (@ "data:% @", myStringOrObject); // Logboektekst die verwijst naar een andere tekenreeks of een van NSObject afgeleid object.

Opmerkingen

Voor het loggen van verschillende soorten objecten en gegevenstypen raadpleegt u: Objective-C, Formaatspecificaties

logging

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

Het eerste argument van NSLog is een NSString met de indeling voor logboekberichten. De rest van de parameters worden gebruikt als waarden ter vervanging van de opmaakspecificaties.

De opmaak werkt precies hetzelfde als printf , behalve de aanvullende opmaakspecificatie %@ voor een willekeurig Objective-C-object. Deze:

NSLog(@"%@", object);

is gelijk aan:

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

NSLog versus printf

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

Output:

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

NSLog voert de datum, tijd, NSLog , proces-ID en thread-ID uit naast het logboekbericht. printf voert het bericht gewoon uit.

NSLog vereist een NSString en voegt aan het einde automatisch een nieuwe regel toe. printf vereist een C-string en voegt niet automatisch een nieuwe regel toe.

NSLog stuurt uitvoer naar stderr , printf stuurt uitvoer naar stdout .


Sommige format-specifiers in printf versus NSLog zijn verschillend. Wanneer u bijvoorbeeld een geneste tekenreeks opneemt, treden de volgende verschillen op:

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

NSLog-uitvoerformaat

NSLog(@"NSLog message");

Het bericht dat wordt afgedrukt door NSLog bellen heeft de volgende indeling wanneer het wordt bekeken in Console.app:

Datum Tijd Programma naam Proces ID Discussie-ID Bericht
2016-07-16 08:58:04.681 test [46259 : 1244773] NSLog message

Variabele waarden vastleggen

Je zou NSLog niet moeten bellen zonder een letterlijke NSLog als deze:

NSLog(variable);    // Dangerous code!

Als de variabele geen NSString , crasht het programma, omdat NSLog een NSString verwacht.

Als de variabele een NSString , werkt deze tenzij uw string een % bevat. NSLog zal de % -reeks ontleden als een format-specificeerder en vervolgens een NSLog van de stapel lezen, wat een crash veroorzaakt of zelfs willekeurige code uitvoert .

Maak in plaats daarvan altijd het eerste argument een opmaakspecificatie, zoals deze:

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

Leeg bericht wordt niet afgedrukt

Wanneer NSLog wordt gevraagd om een lege string af te drukken, wordt het logboek volledig weggelaten.

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

Bovenstaande code drukt niets af .

Het is een goede gewoonte om logboeken te voorzien van labels:

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

De bovenstaande code wordt afgedrukt:

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

Logboekverklaringen verwijderen uit releasebuilds

Berichten die zijn afgedrukt vanuit NSLog worden weergegeven op Console.app, zelfs in de release-build van uw app, wat niet logisch is voor afdrukken die alleen nuttig zijn voor foutopsporing. Om dit op te lossen, kunt u deze macro gebruiken voor foutopsporingsregistratie in plaats van NSLog .

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

Gebruiken:

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

In debug builds zal DLog NSLog . In release builds zal DLog niets doen.

__FUNCTION __ gebruiken

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

Voegt de naam van de klasse en methode in de uitvoer in:

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

NSLog en BOOL type

Er is geen formaataanduiding om het Booleaanse type af te drukken met NSLog. Een manier om een Booleaanse waarde af te drukken, is deze om te zetten in een string.

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

Output:

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

Een andere manier om booleaanse waarde af te drukken, is door deze naar een geheel getal te casten en een binaire uitvoer te bereiken (1 = ja, 0 = nee).

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

Output:

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

NSLog-metagegevens registreren

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

Registreert het bestand, het regelnummer en de functiegegevens samen met eventuele variabelen die u wilt loggen. Dit kan de logboekregels veel langer maken, met name bij uitgebreide bestands- en methodenamen, maar het kan helpen om foutdiagnose te versnellen.

Je kunt dit ook in een macro verpakken (bewaar dit in een Singleton of waar je het het meest nodig hebt);

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

Als u vervolgens wilt inloggen, belt u gewoon

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

Dat geeft je iets als;

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

Loggen door toe te voegen aan een bestand

NSLog is goed, maar u kunt ook inloggen door in plaats daarvan een bestand toe te voegen, met code zoals:

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow