2009-07-01 7 views

Antwort

12

Lesen Sie dazu: http://cocoaheads.byu.edu/wiki/different-nslog

Es ist eine Wiki-Seite auf unserer Cocoaheads Seite, die erklärt, wie um eine "QuietLog" -Funktion zu erstellen, die das tut, was Sie beschreiben. Es zeigt auch, wie Sie QuietLog in ein Makro namens LocationLog einbinden, so dass es den Dateinamen und die Zeilennummer ausgibt, wo Sie die Protokollanweisung haben. Ich benutze es in all meinen Projekten und verliere keine verirrten "NSLog" -Aussagen mehr.

+2

+1 Dang, ich wollte das selbe posten. Ich * habe * diese Wiki-Seite geschrieben ... ;-) –

+0

Und du hast es von den Borkware Quickies bekommen, so dass alles ausgeglichen ist. ;) –

+0

Diese Verbindung ist tot. – JWWalker

0

Sie zu sdterr drucken konnten:

fprintf(stderr, "%s", "Your message"); 

Edit: Check out this implementation von Karl Kraft

+0

Das erfordert (Umwandlung in) eine C-Zeichenfolge, und eine Formatzeichenfolge mit% @ in es funktioniert nicht. Es ist keine schlechte Idee, aber die direkte Verwendung ist kein Ersatz für NSLog(). –

+0

Richtig, Sie sollten es in eine Funktion mit varargs umbrechen. Ich benutze einen von Karl Kraft http://www.karlkraft.com/index.php/2009/03/23/114/ –

+0

Ich mag den Debug-On/Off-Schalter in seinem Ansatz, aber er entzieht sich auch nicht %% (zugegebenermaßen selten, aber problematisch, wenn sie auftreten). –

1

Ich mag Objektive-C-Objekte für Formatzeichenfolgen und Argumente verwenden, so schrieb ich NSLog() neu und fügte es meinen Dienstprogrammen hinzu.


+ (void)myLog:(NSString *)formatString, ... 
{ 
    va_list args; 
    va_start(args, formatString); 
    NSString* output = [[NSString alloc] initWithFormat:formatString arguments:args]; 
    fprintf(stderr, "%s\n", [output UTF8String]); 
    [output release]; 
    va_end(args); 
} 
+0

Wenn Sie den Link, mit dem Dave verbunden ist, gelesen haben, sehen Sie, dass wir das tun, außer dass wir auch %%-Entitäten in der Formatzeichenfolge behandeln. –

+0

Quinn, ich habe diesen Beitrag erst gesehen, nachdem ich meine Antwort gepostet habe. Auch gibt es etwas, das gesagt werden kann, um die Antwort im Voraus zu haben und nicht einem externen Link folgen zu müssen. – Mark

+0

Keine Sorgen. (SO wird Ihnen normalerweise sagen, wenn andere Antworten gepostet haben, aber Überschneidungen sind ganz normal.) Sie haben recht, manchmal ist es schön, den Code in der Antwort richtig zu haben. Sobald es jedoch eine bestimmte Größe überschreitet, oder in diesem Fall, wenn sich die Wiki-Seite wahrscheinlich ändert (was es seit Daves Post hat), kann es besser sein, zu verlinken. –

1

Haben Sie versucht CFShow()?

+0

(Link zur Dokumentation hinzugefügt) Ich war mir dieser Funktion nicht bewusst, gut zu wissen.Es ist jedoch kein Drop-In-Ersatz, da Sie einen NSString * als CFStringRef haben müssen. Dennoch könnte man leicht ein Makro oder eine Funktion definieren, um CFShow() zu umbrechen ... –

+0

Unglücklicherweise hat CFShow in Leopard ein sehr merkwürdiges Verhalten, das Linien irrtümlich unleserlich umschließt. Für Leopard ist es am besten, CFShow ganz zu vermeiden. –

2

Dieser Präprozessormakro ist einfach zu implementieren und Sie müssen nicht alle Ihre aktuellen NSLog Aussagen ändern:

#define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]); 

Es vollständig wie NSLog ohne all die zusätzlichen Dinge, bevor die Nachricht funktioniert.

Ich Original fand dies auf einer anderen SO Frage, aber ich kann es jetzt nicht finden.