In deze snelle tip zullen we leren hoe de output die wordt gegenereerd door NSLog aan te passen om programma's efficiënter te debuggen. Lees verder!
Standaard toont NSLog uitvoer in het volgende formaat:
Datum Tijd OurApp [] NSLog-uitvoer
Een real-world voorbeeld kan er als volgt uitzien:
2013-08-03 00: 35: 53.038 TestApp [460: c07] Waarde van het resultaat = 20
De standaarduitvoer is goed, maar laat wat te wensen over. Meestal willen we het volgende zien in een loginstructie:
Kort gezegd, we willen dat NSLog meer als volgt is:
(ClassName MethodName) (SourceFileName: LineNumber) NSLog-uitvoer
Laten we eerst eens kijken hoe NSLog ongewijzigd werkt. NSLog is slechts een C-functie ingebouwd in het fundamenteel kader van Cocoa en gedraagt zich net als elke andere variadische C-functie. Meer specifiek stuurt NSLog foutmeldingen naar de Apple System Log-faciliteit. Het doet dit eenvoudig door zijn argumenten door te geven aan de NSLogv-functie.
Omdat NSLog slechts een dekblad is voor NSLogv, kunnen we NSLog opnieuw definiëren met onze eigen aangepaste aanroep naar NSLogv. Dat is precies wat ik je laat zien in deze tutorial.
Maak een nieuw iOS-project in Xcode, met de Lege applicatie sjabloon. Noem het ExtendNSLog. Selecteer de optie voor automatische referentietelling, maar schakel de opties voor basisgegevens en eenheidstests uit.
Maak een iOS-project met de lege toepassingssjabloon Productnaam moet "ExtendNSLog" zijnMaak nu een headerbestand samen met het project. kiezen Nieuw bestand> Doelstelling - C-klasse. Stel de naam van de klasse in op ExtendNSLogFunctionaliteit. welke een subklasse van NSObject zal zijn.
Maak een sjabloon voor de doelcursus C Stel de klassenaam in op ExtendNSLogFunctionaliteitOpen ExtendNSLogFunctionality.h en plaats de volgende code in de kop:
#importeren# ifdef DEBUG #define NSLog (args ...) ExtendNSLog (__ BESTAND __, __ LINE __, __ PRETTY_FUNCTION __, args); #else #define NSLog (x ...) #endif void ExtendNSLog (const char * -bestand, int lineNumber, const char * functionName, NSString * -formaat, ...);
De bovenstaande voorwaarde definieert een NSLog
verklaring alleen wanneer DEBUG is gedefinieerd. Wanneer DEBUG niet is gedefinieerd, doet de NSLog-instructie niets. De vraag rijst: hoe bepaal je wanneer DEBUG is gedefinieerd? Dit kan worden gedaan door DEBUG = 1 in de preprocessor-instellingen voor uw project toe te wijzen.
Om dit te doen, klikt u op uw toepassingsdoel en selecteert u het tabblad Build-instellingen. Controleer vervolgens of de opties "Alle" en "Gecombineerd" zijn geselecteerd. Zoek naar "preprocessing" en zoek het gedeelte "Preprocessor-macro's". Voeg vervolgens eenvoudig "DEBUG = 1" toe aan het gedeelte Foutopsporing.
Voeg de DEBUG = 1 vlag toe aan de preprocessor-instellingenMerk op dat in meer recente Xcode projectsjablonen er al een DEBUG = 1 macro gedefinieerd is voor de Debug build-configuratie in de Preprocessor Macro's-sectie. Zie deze post op StackOverflow voor meer informatie.
Met de foutopsporingsmacro gedefinieerd, is onze volgende taak het schrijven van de aangepaste versie van NSLog. Open ExtendNSLogFunctionality.m en voeg de volgende code toe:
#import "ExtendNSLogFunctionality.h" void ExtendNSLog (const char * -bestand, int lineNumber, const char * functionName, NSString * -formaat, ...) // Type om informatie over variabele argumenten vast te houden. va_list ap; // Initialiseer een lijst met variabele argumenten. va_start (ap, formaat); // NSLog voegt alleen een nieuwe regel toe aan het einde van het NSLog-formaat als // één er nog niet is. // Hier gebruiken we deze functie van NSLog () if (! [Format hasSuffix: @ "\ n"]) format = [format stringByAppendingString: @ "\ n"]; NSString * body = [[NSString alloc] initWithFormat: format arguments: ap]; // Einde met variabele argumentlijst. va_end (ap); NSString * fileName = [[NSString stringWithUTF8String: file] lastPathComponent]; fprintf (stderr, "(% s) (% s:% d)% s", functionName, [bestandsnaam UTF8String], lineNumber, [body UTF8String]);
Voeg nu de ExtendNSLogFunctionality.h toe aan het prefix-headerbestand Prefix.pch in de sectie #ifdef __OBJC__.
# ifdef __OBJC__ #import#importeren #import "ExtendNSLogFunctionality.h" #endif
Voor een beter begrip van voorvoegselheaders, bekijk dit bericht op Wikipedia. Raadpleeg deze StackOverflow-post voor praktische tips over de prefixkop.
Voeg nu een NSLog toe overal in uw projectcode. In mijn geval heb ik besloten om er een toe te voegen binnen de AppDelegate.m-methode -(BOOL) applicatie: (UIApplication *) applicatie didFinishLaunchingWithOptions: (NSDictionary *) launchOptions
.
int resultaat = 20; NSLog (@ "Waarde van resultaat:% d", resultaat);
Als je nu het project met de Debug-configuratie bouwt en uitvoert, zou je zoiets als dit moeten zien:
(- [AppDelegate-toepassing: didFinishLaunchingWithOptions:]) (AppDelegate.m: 21) Waarde van het resultaat: 20
Proost! Deze uitvoer is veel nuttiger dan de standaardimplementatie. Hopelijk merk je dat deze techniek je veel tijd zal besparen tijdens het debuggen van je eigen programma's!