2011-07-01 11 views
51

में NSLog को सक्षम और अक्षम करें, जब मैं डीबग में हूं और इसे अन्यथा अक्षम करता हूं तो मैं NSLog को सक्षम करना चाहता हूं। एक बहुत ही सरल बात है:DEBUG मोड

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

लेकिन सभी इस #ifdef और #endif तो मैं दूसरी बात यह कोशिश है borring ... :(:

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

यह (.pch अच्छा यह डाल करने के लिए जगह है) काम बहुत ठीक मैं यह कैसे पूर्वप्रक्रमक मोड में काम करने के लिए हल (पुनरावर्ती नहीं है)। लेकिन समस्या यह है NSLog अनंत तर्क है कि है।

void NSLog(NSString *format, ...) 

?

- संपादित करें -

यह कोड आपके NSLog बेहतर बनाने:

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

+1। इस विषय पर http://mobile.tutsplus.com/tutorials/iphone/customize-nslog-for-easier-debugging/ –

+0

पर इस विषय पर एक पूर्ण पुन: प्रयोज्य घटक मैं लिंक में मार्गदर्शिका का पालन करता हूं। लेकिन मुझे निम्नलिखित संकलन त्रुटि मिली: ** आर्किटेक्चर के लिए अनिर्धारित प्रतीक x86_64: ld: आर्किटेक्चर के लिए प्रतीक नहीं मिला x86_64 क्लैंग: त्रुटि: लिंकर कमांड निकास कोड 1 के साथ विफल रहा (उपयोग -v आमंत्रण देखने के लिए) ** कृपया @MahbuburRAaman – Gon

+0

@ गॉन, त्रुटि ** आर्किटेक्चर x86_64 के लिए अपरिभाषित प्रतीकों की सहायता करें: ld: वास्तुकला x86_64 ** के लिए नहीं मिला प्रतीक कई कारणों से प्रकट होता है। उदाहरण के लिए, लापता लाइब्रेरी या अन्य मामलों के लिए, निम्नलिखित SO संसाधन 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- त्रुटि। –

उत्तर

100

इस चाल करना चाहिए:

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

केवल यह .. Putz .. धन्यवाद! – Rodrigo

+1

यह ठीक है लेकिन # एनएसएलओजी (...) एनएसएलओजी (__ VA_ARGS__) को परिभाषित करें; # एनएसएलओजी परिभाषित करें (...) एनएसएलओजी (__ वीए_एआरजीएस__) (अंतिम हटाएं;) –

+0

@ जस्टसिड: मैं DEBUG ध्वज को कैसे सेट या रीसेट कर सकता हूं? –

19

इसमें कुछ समय कम है और यह भी NSLog अक्षम कर देता है का उपयोग करते समय डिवाइस। आप एक खेल लिख रहे हैं, जल्दी-जल्दी भेजे NSLogs 60 से 20.

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

उपरोक्त सभी उत्तर सही हैं करने के लिए अपने एफपीएस कम कर सकते हैं। मैं आपको निम्न तरीके से ऐसा करने का सुझाव दे सकता हूं। मान लीजिए कि मेरे पास कोई ब्रैकेट

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

क्या होगा यदि यह एनएसएलओजी को बिना किसी कथन के प्रतिस्थापित करेगा। तो हम इसे खाली लूप के साथ आसानी से बदल सकते हैं।

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

यह कथन एक बार एक खाली पाश चलाएगा। यह आपके सभी लाइव कोड से सुरक्षित रूप से आपके एनएसएलओजी को हटा देगा। इसे अक्षम करने के लिए लॉग और 0 को सक्षम करने के लिए 1 के लिए

+3

अच्छा बिंदु, और यह दोहराने के लिए भी एक अच्छी जगह है कि बिना किसी ब्रैकेट के 'if' कथन का उपयोग करना संभवतः पहले स्थान पर एक बुरा विचार है। –

+11

कोड 'pre (x == 5)' preprocessed किया जाएगा, जो ठीक है। –

+0

यह टर्नरी ऑपरेटर के साथ अच्छा नहीं खेलता है। –

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 

सेट डिबग।

+0

से पहले कक्षा के शीर्ष पर रख सकते हैं कृपया मैं यह कोड कहां रख सकता हूं? –

+0

आप कॉन्स्टेंट हैडर फ़ाइल बना सकते हैं और उसमें कोड जोड़ सकते हैं और आपको एक्सेस करने के लिए केवल हेडर फ़ाइल आयात करने की आवश्यकता है और आप जिस चर को चाहते हैं उसे लॉग करने के लिए डीबग्लॉग फ़ंक्शन का उपयोग करें .... – Prashant

1

यहाँ एक अच्छा चाल है ... किसी भी मीटर करने के लिए जोड़

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

बदलें किसी भी

NSLog(@"????"); 

साथ

EXTRANSLog(@"????"); 

इस उदाहरण में, मैं एक NSUser बनाया कुंजी और बस को YES पर सेट करें, कुंजी को बदलने के लिए स्विच के कुछ रूपों का उपयोग करें या पूरी तरह से हटाएं यदि यो आप कंसोल डीबगर के माध्यम से EXTRANSLog को देखना नहीं चाहते हैं।

समस्या निवारण के दौरान मैं इसका उपयोग करता हूं और सभी अत्यधिक लॉग प्रकट नहीं करना चाहता हूं। केवल तभी जब कुछ FancyKey == हाँ।

यह

#define NSLog if(1) NSLog 

जहां 1 हां शो है NSLog रूप में ही है, और 0 सं है। नाइस प्रश्न के लिए

संबंधित मुद्दे