2013-08-06 28 views
8

में एनएसओब्जेक्ट विवरण और कस्टम सारांश मैं ऑब्जेक्ट के -(NSString*)description को ओवरराइड करता हूं हालांकि एक्सकोड हमेशा चर दृश्य में सारांश फ़ील्ड में error: summary string parsing error प्रदर्शित करता है।एक्सकोड

- (NSString*)description { 
    return [NSString stringWithFormat:@"<%@ %p> x=%f, y=%f", self.class, self, _x, _y]; 
} 

अगर मैं कंसोल में po objectName टाइप करें, LLDB जुर्माना उत्पादन, के रूप में उम्मीद तथापि Xcode और कमांड p objectName हमेशा त्रुटि से संकेत मिलता है दिखाता है, इसलिए उचित डिबग विवरण प्रारूप क्या करना है:

मेरे वर्तमान कार्यान्वयन निम्नलिखित है सारांश क्षेत्र का काम करें? ध्यान देने योग्य है कि "पी" कमांड का आउटपुट सारांश संदेश के समान है जो आप फाउंडेशन कक्षाओं के उदाहरणों के लिए एक्सकोड में देखते हैं।

अद्यतन:

जहां तक ​​मेरा "Xcode में WWDC 2012 सत्र डीबगिंग" से देख सकते हैं, कस्टम के सारांश कस्टम अजगर स्क्रिप्ट केवल का उपयोग कर कार्यान्वित किया जा सकता। -(NSString*)description या -(NSString*)debugDescription विधियां किसी भी तरह से सारांश संदेशों से कनेक्ट नहीं हैं। मैंने सोचा कि वे इसलिए हैं क्योंकि मुझे एक त्रुटि प्रदर्शित हुई है, लेकिन ऐसा लगता है कि यह कक्षाओं के लिए एक मानक संदेश है जिनके पास अपने स्वयं के स्वरूप नहीं हैं।

+0

आप कहते हैं "ओवरराइड" - क्या यह सबक्लास या श्रेणी है? और सुपरक्लास क्या है? –

+2

और मैं आपको यह नहीं कहता कि आप एक्सकोड में "पी ऑब्जेक्टनाम" करते हैं। एक्सकोड डीबगर में मैंने हमेशा ऑब्जेक्ट के लिए 'po' किया है। 'पी' स्केलर्स के लिए है। –

+0

नोट करने के लिए एक बात, हॉट लिक्स, यह है कि "पी ऑब्जेक्टनाम" मानक फाउंडेशन ऑब्जेक्ट्स (आपके एनएसएसटींग्स, आपके एनएसएआरआरएआर इत्यादि) के लिए काम करेगा क्योंकि एलएलडीबी में अंतर्निर्मित फॉर्मेटर्स हैं जो जानते हैं कि किसी भी को चलाने के बिना ऑब्जेक्ट को कैसे प्रारूपित किया जाए आपके कार्यक्रम में कोड। जैसा कि एंडी ने अपने अपडेट में नोट किया है, आप पाइथन में अपनी ऑब्जेक्ट के लिए अपने स्वयं के कस्टम फॉर्मेटर्स भी लिख सकते हैं - इसे लटकने के बाद यह बहुत आसान है। –

उत्तर

2

मेरा सुझाव है कि कम से कम:

- (NSString*)description { 
    return [NSString stringWithFormat:@"%@; x=%f, y=%f", [super description], _x, _y]; 
} 

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

इसके अलावा, "सारांश स्ट्रिंग पार्सिंग त्रुटि" एक एलएलडीबी त्रुटि है। यह केवल डीबगर द्वारा रिपोर्ट किया जा रहा है। प्रति its documentation, po उद्देश्य-सी वस्तुओं के लिए सही है; p सी या सी ++ वस्तुओं के लिए है। तो आपको उस त्रुटि पर ध्यान देने की आवश्यकता नहीं है - यह अनिवार्य रूप से केवल आपको बता रहा है कि आपने गलत lldb कमांड का उपयोग किया है।

संपादित करें: के लिए क्या इसके लायक है, CFArray द्वारा प्रयोग किया जाता विधि open source है और लगता है कि: Xcode के डिबगर प्रतिसाद नहीं:

static CFStringRef __CFArrayCopyDescription(CFTypeRef cf) { 
    CFArrayRef array = (CFArrayRef)cf; 
    CFMutableStringRef result; 
    const CFArrayCallBacks *cb; 
    CFAllocatorRef allocator; 
    CFIndex idx, cnt; 
    cnt = __CFArrayGetCount(array); 
    allocator = CFGetAllocator(array); 
    result = CFStringCreateMutable(allocator, 0); 
    switch (__CFArrayGetType(array)) { 
    case __kCFArrayImmutable: 
    CFStringAppendFormat(result, NULL, CFSTR("<CFArray %p [%p]>{type = immutable, count = %u, values = (%s"), cf, allocator, cnt, cnt ? "\n" : ""); 
    break; 
    case __kCFArrayDeque: 
    CFStringAppendFormat(result, NULL, CFSTR("<CFArray %p [%p]>{type = mutable-small, count = %u, values = (%s"), cf, allocator, cnt, cnt ? "\n" : ""); 
    break; 
    } 
    cb = __CFArrayGetCallBacks(array); 
    for (idx = 0; idx < cnt; idx++) { 
    CFStringRef desc = NULL; 
    const void *val = __CFArrayGetBucketAtIndex(array, idx)->_item; 
    if (NULL != cb->copyDescription) { 
     desc = (CFStringRef)INVOKE_CALLBACK1(cb->copyDescription, val); 
    } 
    if (NULL != desc) { 
     CFStringAppendFormat(result, NULL, CFSTR("\t%u : %@\n"), idx, desc); 
     CFRelease(desc); 
    } else { 
     CFStringAppendFormat(result, NULL, CFSTR("\t%u : <%p>\n"), idx, val); 
    } 
    } 
    CFStringAppend(result, CFSTR(")}")); 
    return result; 
} 

ऊपर अन्य टिप्पणी के साथ के रूप में, मैं जुआ खेलने के लिए है कि इसका जवाब है तैयार हूँ किसी भी अर्थ में स्मार्ट नहीं है और निश्चित रूप से उद्देश्य 0 सीका उद्देश्य उद्देश्य-सी विवरण प्राप्त करने के लिए पर्याप्त स्मार्ट नहीं है; यदि आपका ऑब्जेक्ट एक अनजान उद्देश्य-सी ऑब्जेक्ट है तो डीबगर इसे समझने में सक्षम नहीं होगा।

+0

पर बग रिपोर्ट दर्ज करें, सुझाव के लिए धन्यवाद। मैं सिर्फ एनएसएआरएआरई की तरह एक अच्छा संकेत चाहता था, यह सरणी में तत्वों की संख्या दिखाता है। – Andy

+0

... और आप 'po' टाइप नहीं करना चाहते हैं? यदि कोई अंतर है, तो अनुमान में, यह है कि 'एनएसएआरएआरई' टोल-फ्री ब्रिज है और इसलिए यह केवल एक उद्देश्य-सी वस्तु नहीं बल्कि कम से कम एक अन्य प्रकार की चीज है। – Tommy

+1

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