खोज…


वाक्य - विन्यास

  • NSLog (@ "लॉग करने के लिए पाठ"); // मूल पाठ लॉग
  • NSLog (@ "डेटा:% f -%। 2f", myFloat, otherFloat); // फ्लोट संख्या सहित पाठ लॉगिंग।
  • NSLog (@ "डेटा:% i", myInteger); // पूर्णांक संख्या सहित पाठ लॉगिंग।
  • NSLog (@ "डेटा:% @", myStringOrObject); // लॉगिंग टेक्स्ट एक और स्ट्रिंग या किसी NSObject व्युत्पन्न वस्तु को संदर्भित करता है।

टिप्पणियों

विभिन्न प्रकार की वस्तुओं और डेटा-प्रकारों को लॉग करने के लिए: उद्देश्य-सी, प्रारूप विनिर्देशक

लॉगिंग

NSLog(@"Log Message!");
NSLog(@"NSString value: %@", stringValue);
NSLog(@"Integer value: %d", intValue);

NSLog का पहला तर्क एक NSString जिसमें लॉग संदेश प्रारूप है। बाकी मापदंडों को प्रारूप विनिर्देशक के स्थान पर प्रतिस्थापित करने के लिए मान के रूप में उपयोग किया जाता है।

स्वरूपण बिल्कुल printf के समान कार्य करता है, एक अतिरिक्त वस्तु-सी वस्तु के लिए अतिरिक्त प्रारूप निर्दिष्ट %@ को छोड़कर। इस:

NSLog(@"%@", object);

के बराबर है:

NSLog(@"%s", [object description].UTF8String);

NSLog बनाम प्रिंटफ

NSLog(@"NSLog message");
printf("printf message\n");

आउटपुट:

2016-07-16 08:58:04.681 test[46259:1244773] NSLog message
printf message

NSLog लॉग संदेश के अलावा दिनांक, समय, प्रक्रिया का नाम, प्रक्रिया आईडी और थ्रेड आईडी को आउटपुट करता है। printf सिर्फ संदेश को आउटपुट करता है।

NSLog को NSString आवश्यकता होती है और स्वचालित रूप से अंत में एक नई पंक्ति जोड़ता है। printf को एक सी स्ट्रिंग की आवश्यकता होती है और स्वचालित रूप से एक नई पंक्ति नहीं जोड़ता है।

NSLog आउटपुट को stderr भेजता है, printf आउटपुट को stdout भेजता है।


printf बनाम NSLog में कुछ format-specifiers अलग हैं। उदाहरण के लिए जब किसी नेस्टेड स्ट्रिंग को शामिल किया जाता है, तो निम्न अंतर होते हैं:

NSLog(@"My string: %@", (NSString *)myString);
printf("My string: %s", [(NSString *)myString UTF8String]);

NSLog आउटपुट स्वरूप

NSLog(@"NSLog message");

NSLog को कॉल करके मुद्रित होने वाले संदेश को Console.app में देखने के बाद निम्न प्रारूप होता है:

दिनांक समय कार्यक्रम का नाम प्रक्रिया आईडी थ्रेड आईडी संदेश
2016-07-16 08:58:04.681 test [46259 : 1244773] NSLog message

लॉगिंग वैरिएबल मान

आपको NSLog को इस तरह शाब्दिक प्रारूप स्ट्रिंग के बिना नहीं कहना चाहिए:

NSLog(variable);    // Dangerous code!

यदि चर NSString नहीं है, तो प्रोग्राम क्रैश हो जाएगा, क्योंकि NSLog एक NSString अपेक्षा करता है।

यदि चर NSString , तो यह तब तक काम करेगा जब तक कि आपके स्ट्रिंग में %NSLog एक प्रारूप विनिर्देशक के रूप में % अनुक्रम को पार्स करेगा और फिर स्टैक से कचरा मूल्य पढ़ेगा, जिससे दुर्घटना हो सकती है या यहां तक कि मनमाना कोड भी निष्पादित होगा

इसके बजाय, हमेशा पहले तर्क को एक प्रारूप निर्दिष्ट करें, जैसे:

NSLog(@"%@", anObjectVariable);
NSLog(@"%d", anIntegerVariable);

खाली संदेश नहीं छपा है

जब NSLog को खाली स्ट्रिंग प्रिंट करने के लिए कहा जाता है, तो यह लॉग को पूरी तरह से छोड़ देता है।

NSString *name = @"";
NSLog(@"%@", name);  // Resolves to @""

उपरोक्त कोड कुछ भी नहीं प्रिंट करेगा।

लेबल के साथ उपसर्ग लॉग करना एक अच्छा अभ्यास है:

NSString *name = @"";
NSLog(@"Name: %@", name);  // Resolves to @"Name: "

उपरोक्त कोड प्रिंट होगा:

2016-07-21 14:20:28.623 App[87711:6153103] Name: 

रिलीज स्टेटमेंट को रिलीज बिल्ड से हटाना

NSLog से प्रिंट किए गए संदेश Console.app पर आपके ऐप के रिलीज़ बिल्ड में भी प्रदर्शित किए जाते हैं, जो प्रिंटआउट के लिए कोई मतलब नहीं रखता है जो केवल डीबगिंग के लिए उपयोगी हैं। इसे ठीक करने के लिए, आप इस मैक्रो का उपयोग NSLog बजाय डीबग लॉगिंग के लिए कर सकते हैं।

#ifdef DEBUG
#define DLog(...) NSLog(__VA_ARGS__)
#else
#define DLog(...)
#endif

काम में लाना:

NSString *value = @"value 1";
DLog(@"value = %@", value);
// little known fact: programmers look for job postings in Console.app
NSLog(@"We're hiring!"); 

डीबग बिल्ड में, DLog NSLog कॉल करेगा। रिलीज़ बिल्ड में, DLog कुछ नहीं करेगा।

__FUNCTION __ का उपयोग करना

NSLog(@"%s %@",__FUNCTION__, @"etc etc");

आउटपुट में वर्ग और विधि का नाम सम्मिलित करता है:

2016-07-22 12:51:30.099 loggingExample[18132:2971471] -[ViewController viewDidLoad] etc etc

NSLog और BOOL प्रकार

NSLog का उपयोग करके बूलियन प्रकार को मुद्रित करने के लिए कोई प्रारूप निर्दिष्ट नहीं है। बूलियन मान को प्रिंट करने का एक तरीका इसे स्ट्रिंग में बदलना है।

BOOL boolValue = YES;
NSLog(@"Bool value %@", boolValue ? @"YES" : @"NO");

आउटपुट:

2016-07-30 22:53:18.269 Test[4445:64129] Bool value YES

बूलियन मूल्य को प्रिंट करने का एक और तरीका यह है कि इसे पूर्णांक में डाली जाए, एक बाइनरी आउटपुट (1 = हाँ, 0 = नहीं) प्राप्त करना।

BOOL boolValue = YES;
NSLog(@"Bool value %i", boolValue);

आउटपुट:

2016-07-30 22:53:18.269 Test[4445:64129] Bool value 1

NSLog मेटा डेटा लॉग करना

NSLog(@"%s %d %s, yourVariable: %@", __FILE__, __LINE__, __PRETTY_FUNCTION__, yourVariable);

आप जिस भी वैरिएबल को लॉग इन करना चाहते हैं, उसके साथ फाइल, लाइन नंबर और फंक्शन डेटा लॉग करेंगे। यह लॉग लाइनों को लंबे समय तक बना सकता है, विशेष रूप से वर्बोज़ फ़ाइल और विधि नामों के साथ, हालांकि यह त्रुटि निदान को गति देने में मदद कर सकता है।

आप इसे मैक्रो में भी लपेट सकते हैं (इसे सिंगलटन में स्टोर करें या जहां आपको इसकी सबसे अधिक आवश्यकता होगी);

#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);

फिर जब आप लॉग इन करना चाहते हैं, तो बस कॉल करें

ALog(@"name: %@", firstName);

जो आपको कुछ ऐसा देगा;

 -[AppDelegate application:didFinishLaunchingWithOptions:] [Line 27] name: John

किसी फ़ाइल में जोड़कर लॉग इन करना

NSLog अच्छा है, लेकिन आप इसके बजाय कोड का उपयोग करके किसी फ़ाइल में संलग्न करके भी लॉग इन कर सकते हैं:

NSFileHandle* fh = [NSFileHandle fileHandleForWritingAtPath:path];
if ( !fh ) {
    [[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil];
    fh = [NSFileHandle fileHandleForWritingAtPath:path];
}
if ( fh ) {
    @try {
        [fh seekToEndOfFile];
        [fh writeData:[self dataUsingEncoding:enc]];
    }
    @catch (...) {
    }
    [fh closeFile];
}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow