Objective-C Language
लॉगिंग
खोज…
वाक्य - विन्यास
- 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];
}