2011-07-01 31 views
51

Tôi muốn bật NSLog khi tôi đang gỡ lỗi và tắt chế độ này nếu không. Một điều rất đơn giản là:Bật và tắt NSLog ở chế độ DEBUG

#ifdef DEBUG 
NSLog(@"My log"); 
#endif 

Nhưng tất cả điều này #ifdef#endif là Borring ... :(Vì vậy, tôi cố gắng điều khác: (.pch là nơi tốt để đặt nó)

#ifdef DEBUG 
# define NSLog(text) NSLog(text); 
#else 
# define NSLog(text) 
#endif 

này làm việc rất tốt (không đệ quy). Nhưng vấn đề là NSLog có lập luận vô hạn.

void NSLog(NSString *format, ...) 

Làm thế nào tôi giải quyết này để làm việc trong chế độ tiền xử lý?

- Edit -

Mã này làm NSLog của bạn tốt hơn:

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

+1 cho Câu hỏi hay. Một thành phần tái sử dụng hoàn chỉnh về chủ đề này tại http://mobile.tutsplus.com/tutorials/iphone/customize-nslog-for-easier-debugging/ –

+0

Tôi làm theo hướng dẫn trong liên kết. Nhưng tôi nhận được lỗi biên dịch sau: ** Biểu tượng không xác định cho kiến ​​trúc x86_64: ld: biểu tượng không tìm thấy kiến ​​trúc x86_64 clang: lỗi: lệnh liên kết không thành công với mã thoát 1 (sử dụng -v để xem lời gọi) ** Xin hãy giúp @MahbuburRAaman – Gon

+0

@Gon, Lỗi ** Biểu tượng không xác định cho kiến ​​trúc x86_64: ld: không tìm thấy (các) biểu tượng cho kiến ​​trúc x86_64 ** vì một vài lý do. Ví dụ: đối với thư viện bị thiếu hoặc các trường hợp khác, hãy xem tài nguyên SO sau http://stackoverflow.com/questions/18408531/xcode-build-failure-undefined-symbols-for-architecture-x86-64, http: //stackoverflow.com/questions/11996227/undefined-symbols-for-architecture-x86-64-in-objective-c, http://stackoverflow.com/questions/6231368/objective-c-undefined-symbol-compilation- lỗi. –

Trả lời

100

này nên làm như lừa:

#ifdef DEBUG 
# define NSLog(...) NSLog(__VA_ARGS__) 
#else 
# define NSLog(...) (void)0 
#endif 
+0

Chỉ có điều này .. Putz .. Cảm ơn! – Rodrigo

+1

Tốt nhưng thay thế # define NSLog (...) NSLog (__ VA_ARGS__); với # define NSLog (...) NSLog (__ VA_ARGS__) (xóa lần cuối;) –

+0

@JustSid: Làm cách nào để đặt hoặc đặt lại cờ DEBUG? –

19

Đây là một chút ngắn hơn và cũng vô hiệu hóa NSLog khi sử dụng Thiết bị. Nếu bạn đang viết một trò chơi, NSLogs được gửi thường xuyên có thể giảm FPS của bạn từ 60 xuống 20.

#if !defined(DEBUG) || !(TARGET_IPHONE_SIMULATOR) 
    #define NSLog(...) 
#endif 
8

Tất cả các câu trả lời ở trên đều chính xác. Tôi có thể đề nghị bạn làm điều đó theo cách sau. Giả sử tôi có tuyên bố if không có dấu ngoặc đơn

if(x==5) 
NSLog("x is 5"); 

Điều gì sẽ xảy ra nếu thay thế NSLog mà không có tuyên bố. Vì vậy, chúng tôi chỉ có thể thay thế nó bằng một vòng lặp trống.

#ifdef DEBUG 
#define NSLog(...) NSLog(__VA_ARGS__) 
#else 
#define NSLog(...) do {} while (0) 
#endif 

Tuyên bố này sẽ chạy một vòng trống một lần. Điều này sẽ loại bỏ an toàn NSLog của bạn khỏi tất cả các mã trực tiếp của bạn.

+3

Điểm tốt, và đó cũng là một nơi tốt để lặp lại điều đó bằng cách sử dụng câu lệnh 'if' không có dấu ngoặc đơn có lẽ là một ý tưởng tồi ngay từ đầu. –

+11

mã sẽ được xử lý trước thành 'if (x == 5);'. –

+0

Điều này không phù hợp với nhà điều hành bậc ba. –

1
#ifndef Debug 
    #define Debug 1 
#endif 

#if Debug 
# define DebugLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); 
#else 
# define DebugLog(...) 
#endif 

Đặt Gỡ lỗi thành 1 để bật nhật ký và 0 để tắt nhật ký.

+0

Tôi có thể đặt mã này ở đâu? –

+0

Bạn có thể tạo tệp Header không đổi và thêm mã vào nó và để truy cập bạn chỉ cần nhập tệp Header và sử dụng hàm DebugLog để ghi lại các biến bạn muốn .... – Prashant

1

Đây là một thủ thuật rất hay ... thêm vào bất kỳ .m

#define EXTRANSLog if([[NSUserDefaults standardUserDefaults] boolForKey:@"SomeFancyKey"] == YES) NSLog 

Thay thế bất kỳ

NSLog(@"????"); 

với

EXTRANSLog(@"????"); 

Trong ví dụ này, tôi đã tạo ra một NSUser và thiết lập BOOL thành YES ,, sử dụng một số hình thức chuyển đổi vv để thay đổi chìa khóa thành NO hoặc loại bỏ hoàn toàn nếu yo u không muốn xem trình gỡ lỗi giao diện điều khiển của EXTRANSLog.

Tôi sử dụng tính năng này khi khắc phục sự cố và không muốn tất cả các nhật ký thừa xuất hiện. Chỉ khi SomeFancyKey == CÓ.

Đây là giống như

#define NSLog if(1) NSLog 

trong đó 1 là YES chương NSLog, và 0 là NO.

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