2010-08-15 33 views
21

NSLog() có các biến thể in không có dấu thời gian và ngày tháng và dòng mới tự động không?Có thể NSLog() không có tem thời gian và ngày, và dòng mới tự động không?

Cảm ơn. Bây giờ với mã sau đây, tôi có thể in NSString, CString, hoặc các đối tượng:

#import <Foundation/Foundation.h> 
#import <stdio.h> 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    NSString *s = @"Hello, World!"; 
    NSDate *today = [NSDate date]; 

    NSLog(@"%@", s); 
    printf("%s at %s", [s UTF8String], [[today description] UTF8String]); 

    [pool drain]; 
    return 0; 
} 
+0

Sử dụng [** 'MLog.h trên GitHub' **] (https://github.com/InderKumarRathore/MLog) –

Trả lời

19

Sử dụng printf() thay vì NSLog()

+0

Printf() có hỗ trợ NSString không? –

+4

@Trước khi không, bạn sẽ phải sử dụng một cái gì đó như 'printf ("% s% s \ n ", [someString UTF8String], [[mô tả một sốObject] UTF8String]);" – cobbal

+0

Không, đó là hàm C. Vì vậy, bạn sẽ phải chuyển đổi NSString thành một mảng char.Vì vậy, 'printf ([myString cStringUsingEncoding: NSASCIIStringEncoding]); ' – NebulaFox

14

Nó làm phiền tôi quá, vì vậy tôi đã viết một hàm để thay thế NSLog()printf():

void IFPrint (NSString *format, ...) { 
    va_list args; 
    va_start(args, format); 

    fputs([[[[NSString alloc] initWithFormat:format arguments:args] autorelease] UTF8String], stdout); 

    va_end(args); 
} 

Sau đó, bạn chỉ có thể sử dụng nó thay vì NSLog() (ví dụ: IFPrint(@"Current date: %@", [NSDate date])), nhưng nó sẽ không in ra bất kỳ dấu thời gian hoặc dòng mới nào, và bạn không phải lộn xộn với C trings và mảng, và whatnot. Nó khá tiện dụng, tôi muốn nói.

Nếu bạn muốn, hãy xem mã đầy đủ của tôi (Tôi cũng đã viết một thay thế cho fprintf, scanf và fscanf) here.
(Cũng có một chủ đề SO về nó here).

2

điều đầu tiên tôi làm trên bất kỳ dự án là giảm (phiên bản đặc của tôi) this class ... mà được thoát khỏi TẤT CẢ các vô nghĩa trong NSLog ... Nơi này ở phía trên cùng của một tập tin .m - và giao diện điều khiển của bạn đầu ra sẽ là PERFECT.

#import <Foundation/Foundation.h> 
#import <stdio.h> 
#define MLogString(s,...) \ 
    [MLog logFile:__FILE__ lineNumber:__LINE__ \ 
     format:(s),##__VA_ARGS__] 
@interface MLog : NSObject { } 
+ (void) logFile: (char*) sourceFile lineNumber: (int) lineNumber format: (NSString*) format, ...; 
+ (void) setLogOn: (BOOL) logOn; 
@end 
#ifndef NDEBUG 
extern void _NSSetLogCStringFunction(void (*)(const char *string, unsigned length, BOOL withSyslogBanner)); 
static void PrintNSLogMessage(const char *string, unsigned length, BOOL withSyslogBanner){ puts(string); } 
static void HackNSLog(void) __attribute__((constructor)); 
static void HackNSLog(void){ _NSSetLogCStringFunction(PrintNSLogMessage); } 
#endif 
static BOOL __MLogOn = NO; 
@implementation MLog 
+ (void) initialize { char * env = getenv("MLogOn"); 
    if (strcmp(env == NULL ? "" : env, "NO") != 0) __MLogOn = YES; 
} 
+ (void) logFile: (char *) sourceFile lineNumber: (int) lineNumber format: (NSString *) format, ...; { 
    va_list ap; NSString *print, *file; 
    if (__MLogOn == NO) return; va_start(ap, format); 
    file = [[NSString alloc] initWithBytes: sourceFile     length:strlen(sourceFile) encoding: NSUTF8StringEncoding]; 
    print = [[NSString alloc] initWithFormat:format arguments: ap]; 
    va_end(ap); // NSLog handles synchronization issues 
    NSLog(@"%s: %d %@", [[file lastPathComponent] UTF8String], lineNumber, print); return; 
} 
+ (void) setLogOn: (BOOL) logOn { __MLogOn = logOn; } 
@end 
+1

AppStore có an toàn không? –

12

Mã này sẽ làm việc

#ifdef DEBUG 
    #define NSLog(FORMAT, ...) fprintf(stderr,"%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]); 
#else 
    #define NSLog(...) {} 
#endif 
+1

-1 để sử dụng stderr –

+0

Rất đẹp. @ marshaul, tại sao stderr xấu để sử dụng? Tôi không biết NSLog thường viết ở đâu. –

+0

Nó không phải là "xấu", nó chỉ thiếu điểm có STDERR riêng biệt và các luồng STDOUT. Quy ước này là sử dụng STDOUT cho đầu ra "bình thường" và STDERR cho đầu ra "bất thường" (lỗi, v.v.). Vì người dùng có thể chuyển hướng một cách rõ ràng các luồng (chẳng hạn như bằng cách chuyển hướng STDERR đến/dev/null), nó không có ý nghĩa gì khi đưa mọi thứ tới STDERR. Đầu ra của bảng điều khiển/đầu cuối là đầu ra và lỗi là lỗi. Điểm của tất cả những gì là STDOUT là (nên) bình thường/trường hợp mặc định. –

3

Tôi thích giải pháp của Itai. Tôi vừa sửa đổi mã để sử dụng CFShow trong môi trường ARC.

void CFLog(NSString *format, ...) 
{ 
    va_list args; 
    va_start(args, format); 

    CFShow((__bridge CFStringRef)[[NSString alloc] initWithFormat:format arguments:args]); 

    va_end(args); 
} 
2

Xác định một macro

#if __has_feature(objc_arc) 
    #define DLog(format, ...) CFShow((__bridge CFStringRef)[NSString stringWithFormat:format, ## __VA_ARGS__]); 
#else 
    #define DLog(format, ...) CFShow([NSString stringWithFormat:format, ## __VA_ARGS__]); 
#endif 

Và sử dụng macro này trong bạn mã như

NSLog(@"Content with time stamp"); 
DLog(@"Content without time stamp"); 

Đây là kết quả của giao diện điều khiển

NSLog->2014-01-28 10:43:17.873 TestApp[452:60b] Content with time stamp
DLog - >Content without time stamp


P.S.

Nếu có ai muốn Nhật ký tùy chỉnh cung cấp cho bạn thêm thông tin như tên phương thức/số dòng, v.v. có thể tải xuống mã nguồn mở MLog.h on GitHub.

+1

@Charles Cảm ơn bạn, tôi sắp sửa làm điều đó. Tôi không thể tin rằng bản chỉnh sửa đã được phê duyệt. Tôi đã bình chọn để từ chối với bình luận "Thực tế là nó là một liên kết làm cho rõ ràng. Chỉnh sửa này là tự quảng cáo trắng trợn mà không thêm bất kỳ giá trị cho câu trả lời." –

+1

Bình tĩnh kẻ, iOSDeveloperMẹo bạn có một trang web tốt và thay vì đưa ra bất kỳ bình luận hoặc bất cứ điều gì, bạn nên liên lạc với tôi và tôi cũng đã giúp bạn. Nhưng ý tưởng về 'DMCA' đã thay đổi suy nghĩ của tôi và bây giờ tôi đã cải thiện câu trả lời của mình về ARC. –

+0

Điều này không hiển thị đúng chữ cái UTF8 không phải tiếng Anh. Nó thay vào đó hiển thị số unicode của họ (hoặc bất cứ điều gì nó được gọi là) như '\ u006z'. –

Các vấn đề liên quan