Xcode डीबगर: चर का मान देखें


107

UITableViewController में मेरा कोड:

delegate.myData = [myData objectAtIndex:indexPath.row];

मैं डीबगर में delegate.myDataया उसके मूल्यों को कैसे देख सकता हूं indexPath.row? delegate.myDataएक सरणी और indexPath.rowएक होना चाहिए int। मैं केवल वस्तुओं की स्मृति पतों को देख सकते हैं delegateऔर indexPathलेकिन कहाँ हो myDataऔर row?

वैकल्पिक शब्द

जवाबों:


142

Xcode डीबगर में NSDictionary चर की सामग्री को देखने के लिए इसे कैसे जांचें ?

मैं भी उपयोग करता हूं

po variableName
print variableName

सांत्वना में।

आपके मामले में इसे निष्पादित करना संभव है

print [myData objectAtIndex:indexPath.row]  

या

po [myData objectAtIndex:indexPath.row]

धन्यवाद! मैं बहुत कोशिश करता हूं: "प्रिंट करें [myData objectAtIndex: indexPath.row]", "po [myData objectAtIndex: indexPath.row]", "print indexPath.row", "po indexPath.row", ... हर बार जब भी मैं आता हूं। संदेश मिला "पंक्ति नाम का कोई सदस्य नहीं है।" यह काम करता है: "प्रिंट इंडेक्सपैथ" और "पो इंडेक्सपैथ"। इसलिए मैंने इसके बजाय "[]" का उपयोग करने की कोशिश की। ":" po [indexPath row] "->" "NIL ऑब्जेक्ट का विवरण प्रिंट नहीं कर सकता।" "po [indexPath getRow]" -> "लक्ष्य इस संदेश चयनकर्ता को जवाब नहीं देता है।" :-(
माननी

4
प्रिन्ट (int) [इंडेक्सपथ रो]
एंड्री

po [myData objectAtIndex: (int) [indexPath row]]
एंड्री

@VanDuTran मुझे पूरा यकीन है कि po objस्विफ्ट में बराबर है po print(obj)
क्रिस

यह कम्प्यूटेड गुणों के मूल्यों को खोजने के लिए भी सही था। धन्यवाद!
पाउला हस्सेंटांफेल

25

मैं अन्य पोस्टरों से सहमत हूं कि विकासशील वातावरण के रूप में Xcode में चर को डीबग करने का एक आसान तरीका शामिल होना चाहिए। खैर, अच्छी खबर है, वहाँ एक है!

Xcode में वेरिएबल्स को डीबग करने के तरीके के बारे में एक सरल उत्तर / ट्यूटोरियल खोजने और न खोज पाने के बाद, मैं Xcode के साथ ही इसका पता लगाने गया और इसे (कम से कम मेरे लिए) बहुत उपयोगी खोज पाया।

Xcode 4.6.3 में अपने चर को आसानी से कैसे डिबग करें

Xcode की मुख्य स्क्रीन में स्क्रीनशॉट में दिखाए गए ऊपरी-दाएँ कोने के बटन पर क्लिक करके नीचे डीबग एरिया को देखना सुनिश्चित करें।

डीबग एरिया बटन

Xcode 4.6.3 में डीबग एरिया

अब एक ब्रेकपॉइंट सेट करें - अपने कोड में वह रेखा जहां आप अपने प्रोग्राम को अपने कोड एरिया की सीमा पर क्लिक करके रोकना चाहते हैं।

ब्रेकप्वाइंट

अब डिबग एरिया में इस बटन को देखें और बीच में एक क्लिक करें। आप देखेंगे कि आपका क्षेत्र अब दो में विभाजित है।

विभाजन क्षेत्र डीबग करें

इस तरह दिखना चाहिए

अब अपना एप्लिकेशन रन करें।

जब पहला ब्रेकपॉइंट आपके प्रोग्राम के निष्पादन के दौरान पहुंच जाता है, तो आप बाईं ओर अपने सभी चर उस ब्रेकपॉइंट पर उपलब्ध देखेंगे।

खोज क्षेत्र

आप अधिक विस्तार के लिए चर पर बाएं तीर का विस्तार कर सकते हैं। और यहां तक ​​कि खोज फ़ील्ड का उपयोग उस चर को अलग करने के लिए करें जिसे आप चाहते हैं और इसे वास्तविक समय पर बदलते हुए देखें क्योंकि आप ब्रेकपॉइंट के दायरे में "कदम" करते हैं।

में कदम

अपने डीबग एरिया के दाईं ओर आप वांछित वैरिएबल पर माउस के राइट-बटन क्लिक का उपयोग करके चर को प्रिंट करने के लिए भेज सकते हैं।

प्रासंगिक मेनू

जैसा कि आप देख सकते हैं, कि प्रासंगिक मेनू बहुत दिलचस्प डिबगिंग विकल्पों से भरा है। जैसे कि वॉच जो पहले से ही टाइप की गई कमांड या एडिट वैल्यू के साथ सुझाई गई है ... जो आपके वैरिएबल के रनटाइम वैल्यू को बदल देती है!


21

इसके अलावा आप कर सकते हैं:

  1. निष्पादन को रोकने के लिए एक ब्रेकपॉइंट सेट करें।
  2. ऑब्जेक्ट निष्पादन क्षेत्र के अंदर होना चाहिए
  3. माउस पॉइंटर को ऑब्जेक्ट या वेरिएबल पर ले जाएं
  4. एक पीला टूलटिप दिखाई देगा
  5. टूलटिप पर माउस ले जाएँ
  6. ऊपर और नीचे इंगित करने वाले दो छोटे तीरों पर क्लिक करें
  7. एक संदर्भ मेनू पॉप अप होगा
  8. "प्रिंट विवरण" का चयन करें, यह एक [वस्तु विवरण] निष्पादित करेगा
  9. वर्णन कंसोल के आउटपुट में दिखाई देगा

IMHO थोड़ा छिपा हुआ और बोझिल ...


मेरे एक्सकोड "प्रिंट विवरण" में काम नहीं कर रहा है, तो मैं इसे कैसे सक्षम कर सकता हूं?
कीर्तिकुमार ए।

@kirtiavaiya एप्लिकेशन को विराम पर होना चाहिए, और आपके वैरिएबल को मुद्रित होने के लिए वर्तमान स्कोप के अंदर होना चाहिए। इसके अलावा, आप सीधे "self.variable" प्रिंट नहीं कर सकते, लेकिन आप मुद्रण के लिए Andriy समाधान का उपयोग कर सकते हैं _ <चर का नाम>। उदाहरण के लिए: self.btnHello में कंसोल में लिखें "po _btnHello" (यह केवल तभी काम करता है जब आपने
गेट्टर

@ लाइटमैन हां, जैसा आपने कहा, लेकिन फिर भी इसका काम नहीं हुआ
कीर्तिकुमार ए

10

आपका भ्रम इस तथ्य से उपजा है कि घोषित गुण (आवश्यक रूप से उसी के नाम पर) (उदाहरण) चर नहीं हैं।

उघाड़ना

indexPath.row

के बराबर है

[indexPath row]

और असाइनमेंट

delegate.myData = [myData objectAtIndex:indexPath.row];

के बराबर है

[delegate setMyData:[myData objectAtIndex:[indexPath row]]];

संश्लेषित गुणों के लिए मानक नामकरण।

इसके अलावा, delegateसंभवतः प्रकार के रूप में घोषित किया जाता है id<SomeProtocol>, अर्थात, कंपाइलर delegateउस बिंदु पर वास्तविक प्रकार की जानकारी प्रदान करने में सक्षम नहीं है , और डिबगर संकलन-समय पर प्रदान की गई जानकारी पर निर्भर है। चूंकि idएक सामान्य प्रकार है, उदाहरण में चर के बारे में कोई संकलन-समय की जानकारी नहीं है delegate

उन कारणों से आप नहीं दिख रहे हैं myDataया rowचर के रूप में।

यदि आप भेजने के परिणाम का निरीक्षण करना चाहते हैं -rowया -myData, आप कमांड का उपयोग कर सकते हैं pया po:

p (NSInteger)[indexPath row]
po [delegate myData]

या अभिव्यक्ति विंडो का उपयोग करें (उदाहरण के लिए, यदि आप जानते हैं कि आपका delegateवास्तविक प्रकार है MyClass *, तो आप एक अभिव्यक्ति जोड़ सकते हैं (MyClass *)delegate, या राइट-क्लिक कर सकते हैं delegate, View Value as…और वास्तविक प्रकार delegate(जैसे MyClass *) टाइप कर सकते हैं ।

कहा जा रहा है, मैं सहमत हूं कि डिबगर अधिक मददगार हो सकता है:

  • संकलन-समय की जानकारी के बजाय रन-टाइम प्रकार की जानकारी का उपयोग करने के लिए डिबगर विंडो को बताने का विकल्प हो सकता है। यह डिबगर को धीमा कर देगा, प्रदान किया जाएगा, लेकिन उपयोगी जानकारी प्रदान करेगा;

  • घोषित संपत्तियों को एक समूह में दिखाया जा सकता है जिसे गुण कहा जाता है और डिबगर विंडो में सीधे (वैकल्पिक) निरीक्षण की अनुमति देता है। यह भी डीबगर को धीमा कर देगा क्योंकि संदेश भेजने / जानकारी प्राप्त करने के लिए एक विधि को निष्पादित करने की आवश्यकता है, लेकिन उपयोगी जानकारी भी प्रदान करेगा।


आपके विवरण के लिए धन्यवाद! इससे मुझे बहुत मदद मिली है! :-)
मन्नी

7

आप रन-टाइम में कंसोल विंडो पर मान प्रिंट कर सकते हैं। नीचे चरण हैं:

  1. एक ब्रेक-पॉइंट रखें, जिसके लिए आप मान प्राप्त करना चाहते हैं
  2. अब चरण-दर-चरण डीबग करें।
  3. वैरिएबल / डेलीगेट पर एक कर्सर रखें जिसका मान रन-टाइम पर जाँचना है।
  4. अब यह चर / प्रतिनिधि का विवरण दिखाएगा
  5. "I" पर क्लिक करने पर विस्तृत विवरण दिखाई देगा
  6. यह कंसोल विंडो पर विवरण भी प्रिंट करेगा।

कंसोल विंडो पर विवरण मुद्रित करने के लिए स्क्रीनशॉट


1
क्या यह तेजी से काम करता है, मैं नई तेजी से कठबोली वस्तु के मूल्यों को देख रहा हूं जैसे हम obj c में देखने के लिए उपयोग करते हैं।
उमरहह्स

1
@umairhhhs यह पोस्ट केवल उद्देश्य-सी के लिए है।
जयप्रकाश दुबे

1
Im सोच रहा था कि यह स्विफ्ट एडिटर में क्यों नहीं है क्योंकि यह बहुत ही सहायक और समय बचाने वाला फीचर था।
उमरहह्स

1

यह थोड़ा जटिल हो जाता है। ये ऑब्जेक्ट कस्टम क्लासेस या स्ट्रक्चर्स हैं, और इनके अंदर देखना अन्य विकास परिवेशों की तरह Xcode पर आसान नहीं है।

अगर मैं आप होते, तो मैं कुछ विवरणों के साथ आपके द्वारा देखे जाने वाले मूल्यों को NSLog कर देता।

अर्थात:

NSLog(@"Description of object & time: %i", indexPath.row);

11
हां, NSLog एक संभावना है, लेकिन डिबगिंग का एक आरामदायक विकल्प नहीं है। मुझे बहुत आश्चर्य है कि वांछित मूल्यों को प्रदर्शित करने का कोई तरीका नहीं है। यह विकास के वातावरण की बुनियादी कार्यक्षमता के लिए है।
मन्नी

2
XCode के बारे में सबसे infurating बात। दयनीय।
ryan0

1

ट्राय रन-> शो-> एक्सप्रेशंस

सरणी के नाम या जो भी आप खोज रहे हैं, उसमें दर्ज करें।


धन्यवाद! मैंने एक्सप्रेशन-विंडो में "indexPath.row" और "डेलीगेट.माईडाटा" दर्ज किया, लेकिन हर बार कॉलम "सारांश" में "दायरे से बाहर" दिखाई देता है :-(
माननी

np, मेरे पास एक ही मुद्दा था जब तक कि मैंने इसे नहीं पाया;)
tbone

1
अपने सरणी या जो कुछ भी सेट करने के बाद आप एक ब्रेकपॉइंट सेट करें और आपको एक्सप्रेशंस में मान मिलना चाहिए। गुड लक
tbone
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.