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];
}


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow