2011-10-13 10 views
7

मैंने कुछ समय एआरसी और कस्टम डेलोक कार्यों के साथ एक अजीब मुद्दे को डीबग करने में व्यतीत किया है।एक्सकोड और एआरसी डीबगिंग समस्या (डिलोक छोड़ना)

  1. मैं NSOperation उपवर्गीकरण कर रहा हूँ वर्ग
  2. मैं इस कार्रवाई के लिए पूरा होने के ब्लॉक सेट
  3. आपरेशन बहुत फ्लैट वस्तु का एक मजबूत संपत्ति द्वारा संदर्भित है (कोई तरीकों, स्वत: ivars, दो मजबूत गुण) इस वस्तु DataRequest
  4. सभी दिशा निर्देशों पूरा होने के ब्लॉक
  5. न संकलक है और न ही विश्लेषक जीई (आपरेशन खुद सहित) स्थानीय वस्तुओं के लिए केवल कमजोर संदर्भ का उपयोग करता है निम्नलिखित
  6. फोन की सुविधा देता है किसी भी मुद्दे को nerate
  7. DataRequest ऑपरेशन समापन ब्लॉक में उत्पन्न होने वाले ऑपरेशन का केवल संदर्भ रखता है और नष्ट हो जाता है। यह हमेशा नष्ट हो जाता है (इसकी dealloc हमेशा निष्पादित)
  8. मेरे ऑपरेशन में एक कस्टम dealloc है। मेरे पास केवल एक ही एनएसएलओजी कॉल है।

... और मुद्दा है:

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

यदि मैं इसे उपकरणों में चलाता हूं, तो सब ठीक है, सिस्टम कंसोल संदेश प्रिंट करता है और आवंटन उपकरण रिपोर्ट करता है कि कस्टम डेलोक सहित उचित स्टैक स्नैपशॉट से ऑपरेशन को मुक्त किया जा रहा है। कोई रिसाव नहीं मिला

मुझे 100% यकीन है कि मैं डीबगिंग और प्रोफाइलिंग के लिए एक ही कंपाइलर सेटिंग्स का उपयोग करता हूं।

अंत में सबसे भ्रमित चीज: यदि मैं [DataRequest dealloc] का एक कस्टम संस्करण बनाता हूं और मैंने self.operation = nil; डाल दिया है - सभी डीबगर से भी ठीक काम करते हैं।

क्या किसी के पास कुछ संकेत देखने के लिए संकलक लिंकर विकल्प कुछ संकेत हैं? क्या यह ऐप्पल टूल्स में बग हो सकता है (हम सभी अपनी त्रुटियों के लिए एक बड़ी मछली को दोषी ठहराते हुए स्थिति में थे, सही?)

... और हाँ मैंने जीडीबी और एलएलडीबी के साथ प्रयास किया है। नतीजा वही था - कुछ क्या संकेत दे सकता है।

मैं एक minimalistic नमूना बनाने की कोशिश की है, लेकिन यह सिर्फ (वास्तव में) काम किया;)

धन्यवाद

+0

मैंने एक बहुत ही बुनियादी अवलोकन किया है ... यदि मैं एक्सकोड (जीडीबी या एलएलडीबी) से सिम्युलेटर पर ऐप चलाता हूं तो मेरे लॉग संदेश 'dealloc' में मुद्रित नहीं होते हैं। अगर मैंने डीबगर छोड़ दिया है और सीधे सिम्युलेटर से ऐप लॉन्च किया है - Console.app सभी संदेशों को दिखाएं। बीच में कोई संकलन कोई संकलन नहीं है। अजीब। – simpleone

+0

... और एक और अधिक सरल परिणाम ... यदि मैं एक डीबगिंग सत्र में एक्सकोड से ऐप चलाता हूं - अगर मैं सिम्युलेटर में मैन्युअल रूप से ऐप चलाता हूं और फिर डीबगर संलग्न करता हूं तो डेलोक को कॉल नहीं किया जाता है (लॉग मुद्रित नहीं किया जाता है)। सभी उम्मीद के अनुसार है। – simpleone

उत्तर

7

आप NSZombiesEnabled है? हमारे पास एक ही समस्या थी और NSZombies को अक्षम करके इसे "हल" किया गया था।

"उत्पाद" -> "योजना" -> "योजना संपादित करें" -> "निदान" -> सही का निशान हटाएँ "सक्षम ज़ोंबी ऑब्जेक्ट्स"

मुझे यकीन है कि नहीं कर रहा हूँ कारण है कि जब NSZombies सक्षम होते हैं dealloc नहीं बुलाया जाता है (मुझे पूरा यकीन है कि इसे एआरसी से पहले बुलाया गया था)।

+0

मुझे परीक्षण करना है - लेकिन हाँ, मेरे पास NSZombiesEnabled सेट है। यह काफी संभावना है - और कम से कम यह विभिन्न व्यवहार के लिए कुछ उचित स्पष्टीकरण देता है। – simpleone

+1

मैं पुष्टि कर सकता हूं NSZombiesEnabled समस्या उत्पन्न कर रहा है। बहुत धन्यवाद! – simpleone

+1

यह NSSombies का उपयोग करते समय एआरसी के साथ सक्षम होने पर, एनएसओपीरेशन के साथ ही नहीं हो सकता है। एआरसी के साथ डेलोक अजीबता को देखते हुए मुख्य बात यह है कि NSZombiesEnabled को अक्षम करना है (जिसे संपादित योजनाओं में "सक्षम ज़ोंबी ऑब्जेक्ट्स" लेबल किया गया है ...> एक्सकोड 4 में डायग्नोस्टिक टैब) –

1

मैं आज भी इसी तरह की समस्या में भाग गया और मुझे यह पता लगाने के लिए लगभग 5 घंटे लगे कि समस्या मेरी परियोजना सेटिंग्स में एनएसजेम्बी सक्षम है।

मैं यह भी मानता हूं कि एआरसी से पहले, इस मामले में डेलोक को बुलाया गया था।

कई परीक्षणों के बाद ऐसा लगता है कि आईओएस 5.x (डिवाइस या सिम्युलेटर) का उपयोग करते समय डेलोक को नहीं कहा जाता है।

लेकिन यह फिर से बुलाया जाता है आईओएस 6.x में (डिवाइस या सिम्युलेटर)

मैं अगर यह परिवर्तन iOS5 में एक बग कि iOS6 में समझौता किया गया है के कारण होता है पता नहीं है (Zombies सक्षम) के साथ, या एक सुविधा पेश की और वापस लुढ़का।

आशा है कि मदद करता है ...

0

मैं इस मुद्दे की ही तरह आज में भाग लेकिन मेरी समस्या एक ब्लॉक द्वारा उत्पन्न एक बनाए रखने के चक्र था।

आप उपयोग कर रहे हैं ब्लॉकों:

  1. यकीन है कि स्व बनाने ब्लॉक के अंदर प्रकट नहीं होता है।
  2. यदि आपको ब्लॉक के अंदर एसईएलएफ का उपयोग करने की आवश्यकता है, तो कमजोर संदर्भ का उपयोग करें।
  3. सुनिश्चित करें कि ब्लॉक के अंदर कोई मैक्रोज़ नहीं है जो स्वयं को संदर्भित कर सकता है (जैसे एनएसएएसएसर्ट)।
संबंधित मुद्दे