Objective-C Language
Skogsavverkning
Sök…
Syntax
- NSLog (@ "text att logga"); // Grundläggande textlogg
- NSLog (@ "data:% f -% .2f", myFloat, anotherFloat); // Loggningstext inklusive floatnummer.
- NSLog (@ "data:% i", myInteger); // Loggningstext inklusive heltal.
- NSLog (@ "data:% @", myStringOrObject); // Loggar text som hänvisar till en annan sträng eller något objekt som härrör från NSObject.
Anmärkningar
För loggning av olika typer av objekt och datatyper hänvisas till: Objekt-C, Format Specifiers
Skogsavverkning
NSLog(@"Log Message!");
NSLog(@"NSString value: %@", stringValue);
NSLog(@"Integer value: %d", intValue);
Det första argumentet med NSLog
är ett NSString
innehåller NSString
. Resten av parametrarna används som värden för att ersätta i stället för formatspecifikationerna.
Formateringen fungerar exakt på samma sätt som printf
, med undantag för den ytterligare formatformat %@
för ett godtyckligt Objekt-C-objekt. Detta:
NSLog(@"%@", object);
är ekvivalent med:
NSLog(@"%s", [object description].UTF8String);
NSLog vs printf
NSLog(@"NSLog message");
printf("printf message\n");
Produktion:
2016-07-16 08:58:04.681 test[46259:1244773] NSLog message
printf message
NSLog
matar ut datum, tid, processnamn, process-ID och tråd-ID förutom loggmeddelandet. printf
bara ut meddelandet.
NSLog
kräver en NSString
och lägger automatiskt till en ny linje i slutet. printf
kräver en C-sträng och lägger inte automatiskt till en ny linje.
NSLog
skickar utdata till stderr
, printf
skickar utdata till stdout
.
Vissa format-specifiers
i printf
vs NSLog
är olika. Följande skillnader uppstår till exempel när du inkluderar en kapslad sträng:
NSLog(@"My string: %@", (NSString *)myString);
printf("My string: %s", [(NSString *)myString UTF8String]);
NSLog Output Format
NSLog(@"NSLog message");
Meddelandet som skrivs ut genom att ringa NSLog
har följande format när det visas i Console.app:
Datum | Tid | Program namn | Process-ID | Tråd-ID | Meddelande | |
---|---|---|---|---|---|---|
2016-07-16 | 08:58:04.681 | test | [46259 | : | 1244773] | NSLog message |
Loggar variabla värden
Du bör inte ringa NSLog
utan en bokstavssträng som denna:
NSLog(variable); // Dangerous code!
Om variabeln inte är en NSString
programmet, eftersom NSLog
förväntar sig en NSString
.
Om variabeln är en NSString
, fungerar den om inte strängen innehåller en %
. NSLog
kommer att analysera %
-sekvensen som en formatspecifikator och sedan läsa ett skräpvärde från bunten, vilket orsakar en krasch eller till och med exekverar godtycklig kod .
I stället gör alltid det första argumentet till ett formatformat, så här:
NSLog(@"%@", anObjectVariable);
NSLog(@"%d", anIntegerVariable);
Tomt meddelande skrivs inte ut
När NSLog
uppmanas att skriva ut en tom sträng utelämnar loggen helt.
NSString *name = @"";
NSLog(@"%@", name); // Resolves to @""
Ovanstående kod kommer inte att skriva ut något .
Det är en bra praxis att prefixa loggar med etiketter:
NSString *name = @"";
NSLog(@"Name: %@", name); // Resolves to @"Name: "
Ovanstående kod kommer att skriva ut:
2016-07-21 14:20:28.623 App[87711:6153103] Name:
Ta bort loggförklaringar från utgivningsbyggnader
Meddelanden som skrivs ut från NSLog
visas på Console.app även i utgåvan av din app, vilket inte är vettigt för utskrifter som bara är användbara för felsökning. För att fixa detta kan du använda detta makro för felsökning i stället för NSLog
.
#ifdef DEBUG
#define DLog(...) NSLog(__VA_ARGS__)
#else
#define DLog(...)
#endif
Att använda:
NSString *value = @"value 1";
DLog(@"value = %@", value);
// little known fact: programmers look for job postings in Console.app
NSLog(@"We're hiring!");
I felsökning bygger DLog
NSLog
. I release- DLog
kommer DLog
att göra någonting.
Använda __FUNCTION __
NSLog(@"%s %@",__FUNCTION__, @"etc etc");
Sätter in klassens och metodnamnet i utgången:
2016-07-22 12:51:30.099 loggingExample[18132:2971471] -[ViewController viewDidLoad] etc etc
NSLog- och BOOL-typ
Det finns inget format som specificeras för att skriva ut boolesktyp med NSLog. Ett sätt att skriva ut booleskt värde är att konvertera det till en sträng.
BOOL boolValue = YES;
NSLog(@"Bool value %@", boolValue ? @"YES" : @"NO");
Produktion:
2016-07-30 22:53:18.269 Test[4445:64129] Bool value YES
Ett annat sätt att skriva ut booleskt värde är att kasta det till heltal och uppnå en binär utgång (1 = ja, 0 = nej).
BOOL boolValue = YES;
NSLog(@"Bool value %i", boolValue);
Produktion:
2016-07-30 22:53:18.269 Test[4445:64129] Bool value 1
Loggar NSLog metadata
NSLog(@"%s %d %s, yourVariable: %@", __FILE__, __LINE__, __PRETTY_FUNCTION__, yourVariable);
Loggar fil, radnummer och funktionsdata tillsammans med alla variabler du vill logga in. Detta kan göra logglinjerna mycket längre, speciellt med ordlista fil- och metodnamn, men det kan hjälpa till att påskynda feldiagnostik.
Du kan också packa detta i en makro (lagra detta i en Singleton eller där du behöver det mest);
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
När du vill logga, ring bara
ALog(@"name: %@", firstName);
Vilket ger dig något liknande;
-[AppDelegate application:didFinishLaunchingWithOptions:] [Line 27] name: John
Loggar genom att lägga till en fil
NSLog är bra, men du kan också logga genom att lägga till en fil istället med kod som:
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];
}