2008-11-14 12 views
45

मुझे संभावित रूप से मूर्ख प्रश्न के लिए क्षमा करें, लेकिन अन्य प्रोग्रामिंग भाषाओं में (PHP या पर्ल जैसे स्क्रिप्टिंग वाले) में अक्सर किसी भी चीज़ को डंप करना आसान होता है चर।उद्देश्य-सी ऑब्जेक्ट (NSArray या NSDictionary) में संग्रहीत डेटा को डंप करने के लिए कैसे करें

उदाहरण के लिए, PHP में var_dump() या print_r() फ़ंक्शन हैं। पर्ल में Data::Dumper सीपीएएन वर्ग इत्यादि हैं

क्या उद्देश्य-सी के लिए ऐसा कुछ है? कुछ घटकों का निरीक्षण करने के लिए जीडीबी का उपयोग करने के बजाय, कुछ मामलों में यह सब कुछ डंप करने में सक्षम होने के लिए बहुत सुविधाजनक होगा।

+0

देखें http://stackoverflow.com/questions/2299841/objective-c-introspection-reflection – neoneye

+0

हैंडी: '[MyView recursiveDescription]' – Jonny

उत्तर

71

, वहाँ कोई PHP के print_r या अजगर के रेपर की तरह "डंप" के बाद से वहाँ कोई शाब्दिक प्रारूप है कि "का प्रतिनिधित्व करता है" उन भाषाओं में के रूप में एक वस्तु है। आप

NSLog(@"%@", myObj); 

या

का उपयोग करते हैं
NSString *stringRep = [NSString stringWithFormat:@"%@",myObj]; 

या

NSString *stringRep = [myObj description]; 

आप (पहले मामले में सांत्वना देने लॉग इन किया), [myObj description] का परिणाम है, एक विधि NSObject में के लिए परिभाषित किया जाएगा किसी ऑब्जेक्ट के विवरण ( डंप) का मुद्रण करने का उद्देश्य।

यदि आप gdb में po myObj का आह्वान करते हैं, तो आपको [myObj debugDescription] (अक्सर description जैसा ही मिलता है, लेकिन हमेशा नहीं)।

वर्ग की तरह NSArray और NSDictionary और NSData ओवरराइड description उनकी सामग्री की एक बहुत उपयोगी पुनरावर्ती विवरण मुद्रित करने के लिए, लेकिन डिफ़ॉल्ट [NSObject description] प्रिंट केवल सूचक मूल्य उदाहरण के लिए इसी।

यदि आप प्रश्नों के प्रकार के लिए कोड को नियंत्रित करते हैं, तो आप अपनी description या debugDescription विधियों को ओवरराइड कर सकते हैं जो आप चाहते हैं। यदि नहीं, तो आप description या debugDescription विधि को किसी श्रेणी का उपयोग करके ओवरराइड कर सकते हैं, या myDebugDescription को परिभाषित करने के लिए किसी श्रेणी का उपयोग कर सकते हैं या ऐसे कुछ जिन्हें आप po [myObj myDebugDescription] का उपयोग करके जीडीबी से आवेदक कर सकते हैं।

+1

'विवरण' विधि सिर्फ वही है जो मुझे चाहिए! जानकारी के लिए धन्यवाद! :) – Manuel

+0

हमेशा इस तरह का संदेश प्राप्त करें: <ऑब्जेक्टनाम: 0x608000482530> –

10

वस्तुओं की सामग्री को डंप करने के लिए NSLog() का उपयोग करें। उदाहरण के लिए:

NSData* myData = //... assume this exists 
NSLog(@"Contents of myData: %@", myData); 

NSLog सिर्फ printf की तरह, एक printf शैली प्रारूप स्ट्रिंग (एक NSString वस्तु की उम्मीद है) मानकों का एक चर सूची के द्वारा पीछा किया है। प्रतिस्थापन चरित्र% @ किसी ऑब्जेक्ट पर किसी ऑब्जेक्ट को वर्णन विधि का प्रतिनिधित्व करता है। यह कोको में अधिकांश उद्देश्य-सी वस्तुओं को डंप करने के लिए उपयोगी है।

यदि आप जीडीबी का उपयोग कर किसी ऑब्जेक्ट की सामग्री को डंप करना चाहते हैं (मुझे लगता है कि आपने इसे जीडीबी के साथ टैग किया है), प्रिंट के बजाय विशेष "पीओ" निर्देश का उपयोग करें। उदाहरण के लिए:

gdb) po myData 

जीडीबी को myData ऑब्जेक्ट को डंप करने का कारण बन जाएगा। पीओ प्रिंट-ऑब्जेक्ट के लिए एक शॉर्टकट है। कोको में

+0

स्ट्रिंग स्वरूपित प्रतिनिधित्व (NSLog और [NSString stringWithFormat:] द्वारा इस्तेमाल किया एट अल।) वस्तु का पूर्ण "डंप" नहीं हो सकता है। यह ऑब्जेक्ट की वर्णन विधि का परिणाम है। चूंकि वस्तुएं इस विवरण को ओवरराइड कर सकती हैं, इसलिए आप इसके उपयोग से अलग-अलग परिणाम निकाल सकते हैं। –

+0

मुझे पता है, यही कारण है कि मैंने कहा "यह कोको में डंपिंग/अधिकांश/उद्देश्य-सी वस्तुओं के लिए उपयोगी है" लेकिन यह मूल रूप से ओपी पूछ रहा है। –

16

आप भी जल्दी से डिबगर में एक वस्तु को देखने के लिए gdb प्रिंट वस्तु आदेश का उपयोग कर सकते हैं:

po dictionary 

यह आपके कोड के भीतर से NSLog (...) बुला के रूप में मूलतः एक ही हो जाएगा।

भी उपयोगी होता है जब NSData कि ASCII डेटा शामिल बाहर मुद्रण है:

p (char *) [data bytes] 
+0

यह केवल कुछ सौ बाइट प्रिंट करता है। मैं इसे सभी प्रिंट कैसे कर सकता हूं? –

4

NSLog प्रवेश से सावधान रहें -> आप सबसे अधिक संभावना नहीं है यह उत्पादन कोड में चाहते हैं।

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

+1

यह एक अच्छा मुद्दा है। मैं बहुत सारे नए उद्देश्य सी प्रोग्रामर को इसका एहसास नहीं है। यदि आप एनएसएलओजी के बारे में सोचते हैं कि ओबीजेसी के प्रिंटफ या std :: cout के रूप में आपको बहुत गलत नहीं जाना चाहिए (और एक डीएलओजी रैपर मैक्रोज़ लिखना तुच्छ है)। – philsquared

+0

आप जितना चाहें उतना एनएसएलओजी का उपयोग कर सकते हैं। आपको बस इतना करना है कि इन लाइनों को अपनी .pch फ़ाइल पर जोड़ना है, सभी एनएसएलओजी लाइनों को रिलीज से जादुई रूप से पट्टी करने के लिए: '#ifndef DEBUG'' # NSFog (...) '' endif' परिभाषित करें ... [यहां देखें ] (http://www.marekbell.com/update-stripping-nslog-output-for-xcode-release-builds/) – SpaceDog

3

मैं आमतौर पर "डिबग" NSArray सामग्री को यह साथ जाना:

NSEnumerator *arrenum = [myarray objectEnumerator]; 
id cobj;  
while (cobj = [arrenum nextObject]) { 
    NSLog(@"%@", cobj); 
} 

कोड NSArray myarray में सभी वस्तुओं की गणना, और फिर के माध्यम से पुनरावृति और प्रिंट हर वस्तु।

आशा है कि यह किसी के लिए उपयोगी हो सकता है!

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