<a target="_blank" href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#//apple_ref/c/func/NSLog">NSLog()</a> eine nützliche Funktion in der frühen Phase eines Projekts zum Testen und Debuggen einer Anwendung für Apple iPhone oder ganz allgemein in XCode-Umgebung. Da nur eine Funktion, genau wie der andere, wird seine Anwesenheit auch zu spüren sein, wenn die Freigabe (Release) unserer ausführbare. potrebbero influire sulle performance della nostra applicazione, soprattutto se abbiamo inserito NSLog() all'interno di loop. Es wird daher notwendig zu entfernen, in gewisser Weise, alle Linien von NSLog() aus unserem Code, weil es nicht notwendig ist, entweder weil die Anrufe an NSLog() , die Leistung unserer Anwendung beeinträchtigen könnten, insbesondere wenn wir setzen NSLog() , um 'innere Schleife.
Unmittelbar auszuschließen Lösung für das "Look" und "Abbrechen", weil es eines Tages wieder verwendet werden könnten. Wir schließen auch die Lösung des "Look" und "Kommentare", unangenehm aus dem gleichen Grund wie zuvor. Zum Glück eine saubere, einfache und mit den richtigen Compiler Konditionale. Was wir tun in der Praxis, und sagen Sie dem Compiler mit, ausschließen - wenn es einen bestimmten Zustand - bei der Erstellung unserer Quelle Linien, die enthalten NSLog() .
Die Zusammenstellungen von Richtlinien und Anweisungen des bedingten Compiler, sind ein sehr mächtiges und weit verbreitet. Wer von der Entwicklung der ANSI-C sicherlich wissen sehr gut, und wird in vielen Situationen utilizzte. Die Besonderheit dieser "Anleitung" liegt in der Tatsache, oben erwähnt, auf die der Compiler und nicht ausführbar zu sehen. Diese Eigenschaft macht sie in vielen Fällen nützlich und kann Probleme lösen, sonst sehr ärgerlich.
Mal sehen, ein Beispiel-Code, der, wie vorhergesagt, Sie "Löschen" können durch die Erstellung Teile des Codes, in unserem Fall NSLog() :
1 2 3 4 5 6 | # Definieren ACTIVE_NSLOG 1 / / Wenn die Konstante definiert ist ACTIVE_NSLOG füllen / / Code-Block zwischen # ifdef und # endif # Ifdef ACTIVE_NSLOG " ... bla bla" ) ; NSLog (@ "... bla bla"); # Endif |
). Bedingte Anweisungen sind Teil der Compiler von der gleichen Familie wie #define , auch in der Tat, werden durch ein "Pfund" (vorausgegangen # ). solo se ACTIVE_NSLOG è definito. In dem gezeigten Beispiel haben wir eine Konstante definiert ACTIVE_NSLOG ; nachfolgende Zeilen Code weist den Compiler an "include" Zeile NSLog() nur dann, wenn ACTIVE_NSLOG definiert ist. Wenn wir uns kümmerten, während der Arbeit an unseren Code, Einfügen Anrufe an NSLog() innerhalb des Blocks #ifdef ... #endif per far sparire, alla prossima compilazione, tutti i nostri NSLog() . #ifdef ... #endif , löschen Sie einfach die Definition der konstanten ACTIVE_NSLOG zu verblassen, die nächste Compilation, alle unsere NSLog() .
Ein bestes und endgültiges
Wir wollen nun sehen, wie Sie die XCode-Umgebung eingerichtet, um noch mehr, was wir hier getan haben, zu verbessern! Zuerst wählen wir einen konstanten Namen, die wir in unseren Projekten, von der Kompilierung ausschließen NSLog() . o quello che preferite. Sie können wählen, den Namen, den Sie mögen, von DEBUG zu MIO_DEBUG oder was auch immer Sie bevorzugen. Öffnen Sie Ihr Projekt, neu oder alt. Platzieren Sie alle NSLog() innerhalb des Blocks (oder Block):
1 2 3 | # Ifdef MIO_DEBUG " ... bla bla" ) ; NSLog (@ "... bla bla"); # Endif |
Wählen Sie die Haupt-Datei des Projekts mit der rechten Maustaste und wählen Sie das Get Info.

Dies öffnet ein Fenster mit Informationen über das Projekt:

Wählen Sie das Register Erstellen, überprüfen Sie, ob Sie in Debug-Konfiguration sind (dies ist die Perle), auf die User-Defined Abschnitt und fügen über den Button unten links, ein neues Feld namens OTHER_CFLAGS . An dieser assegnamoli der Wert -DMIO_DEBUG=1 . Die Syntax ist -D{mia define}=1 .
Dieses Verfahren hat zwei Vorteile:
- Wir dürfen nicht in den Code gesetzt
#define MIO_DEBUG 1, aber wir tun es durch das Projekt Informationen. Also, wenn wir zum Ausfüllen des Release-Version (das eine ohne das gehenNSLog()) müssen wir uns erinnern, um die Zeile zu löschen#define MIO_DEBUG 1 - Die Konstante wird in Bezug auf die Konfiguration definiert, in unserem Fall Debug. Dann werden Übergabe an die Release-Konfiguration (Freigabe) fehlen und die ständigen Reihen mit
NSLog()wird nicht kompiliert werden
Schlussfolgerungen
Das oben beschriebene Verfahren kann in einem moltidutine anderen Fällen nützlich, mit NSLog() , nichts zu tun haben. Bedingte Anweisungen können helfen den Compiler in einer Vielzahl von Kontexten. Sie werden oft von Programmierern verwendet, um die Art der Version des Betriebssystems, das Ziel, die Anwesenheit von mathematischen Prozessoren, bestimmen unter Beibehaltung der gleichen "identisch" Quelle.
Um dies zu verstehen, als Beispiel, können wir unsere ständige utilizzre MIO_DEBUG auch in anderen Bereichen des Codes zu intervenieren:
1 2 3 4 5 6 7 8 9 10 | / / Debug, wenn sie das Spiel gewinnen / / Mit einem Ergebnis von 100 statt 10000 :) # Ifdef MIO_DEBUG score == 100 ) if (score == 100) # Else score == 10000 ) if (score == 10000) # Endif { ; [HaiVinto Self]; } |
Zum Abschluss, hier sind einige Beispiele und Varianten:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | / / In der Regel gibt es eine # Wenn Ausdruck / / If-Anweisung ähnlich der traditionellen, also mit einem vollen Ausdruck / / Prüfen, ob eine Konstante definiert # Ifdef konstant / / Prüfen, ob es nicht eine Konstante definiert # Ifndef konstant / / Else # Else / / Closing des Blocks # Endif |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | / / Zum Beispiel ... # Define DEBUG 1 # Definieren MIA_ALTRA_COSTANTE 5 ... # If DEBUG / / In diesem Fill # Else / / Sonst füllen Sie dieses anderen # Endif # Wenn MIA_ALTRA_COSTANTE> 4 "..." ) ; NSLog (@ "..."); # Endif |
1 2 3 4 | # Ifndef INCLUDE_MIO_FILE # Definieren INCLUDE_MIO_FILE # Include "mio_file.h" # Endif |






Neueste Kommentare
Mark : Vielen Dank, ich habe angezündet
Ich löste es, indem Sie [cc_objc] / / OptionViewController.m - ...
Giovambattista Fazioli : @ Mark: Ich schlage vor, Sie denken, ein richtiger Ansatz. Wenn Sie das Unterklasse der Registerkarte ...
Mark : Entschuldigen Sie die Spam .. Ich bemerkte, dass es einen Fehler .. hier ist die Korrektur [cc_objc] / PrimaClasse.h **** / # import ...
Marco : vergessen .. in [IHK] OptionViewController [/ CCI] für [IHK] @ syntetize [/ CCI] Ich legte den Delegierten
Louis : sehr klar und einfach ich muss zugeben, dass das Schreiben eines pa kaum Delegaten verwenden, erstellt von ...