Objective-C Language
logging
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];
}