मैंने कुछ समय एआरसी और कस्टम डेलोक कार्यों के साथ एक अजीब मुद्दे को डीबग करने में व्यतीत किया है।एक्सकोड और एआरसी डीबगिंग समस्या (डिलोक छोड़ना)
- मैं
NSOperation
उपवर्गीकरण कर रहा हूँ वर्ग - मैं इस कार्रवाई के लिए पूरा होने के ब्लॉक सेट
- आपरेशन बहुत फ्लैट वस्तु का एक मजबूत संपत्ति द्वारा संदर्भित है (कोई तरीकों, स्वत: ivars, दो मजबूत गुण) इस वस्तु
DataRequest
सभी दिशा निर्देशों पूरा होने के ब्लॉक
- न संकलक है और न ही विश्लेषक जीई (आपरेशन खुद सहित) स्थानीय वस्तुओं के लिए केवल कमजोर संदर्भ का उपयोग करता है निम्नलिखित
- फोन की सुविधा देता है किसी भी मुद्दे को nerate
DataRequest
ऑपरेशन समापन ब्लॉक में उत्पन्न होने वाले ऑपरेशन का केवल संदर्भ रखता है और नष्ट हो जाता है। यह हमेशा नष्ट हो जाता है (इसकीdealloc
हमेशा निष्पादित)- मेरे ऑपरेशन में एक कस्टम
dealloc
है। मेरे पास केवल एक ही एनएसएलओजी कॉल है।
... और मुद्दा है:
अगर मैं डिबगर में इस के तहत चलाने, dealloc में ब्रेकप्वाइंट मारा कभी नहीं किया जाता है, लॉग संदेश कभी नहीं दिखाई देता है। मुख्य रूप से मैंने सोचा था कि ऑपरेशन लीक हो रहा था।
यदि मैं इसे उपकरणों में चलाता हूं, तो सब ठीक है, सिस्टम कंसोल संदेश प्रिंट करता है और आवंटन उपकरण रिपोर्ट करता है कि कस्टम डेलोक सहित उचित स्टैक स्नैपशॉट से ऑपरेशन को मुक्त किया जा रहा है। कोई रिसाव नहीं मिला
मुझे 100% यकीन है कि मैं डीबगिंग और प्रोफाइलिंग के लिए एक ही कंपाइलर सेटिंग्स का उपयोग करता हूं।
अंत में सबसे भ्रमित चीज: यदि मैं [DataRequest dealloc]
का एक कस्टम संस्करण बनाता हूं और मैंने self.operation = nil;
डाल दिया है - सभी डीबगर से भी ठीक काम करते हैं।
क्या किसी के पास कुछ संकेत देखने के लिए संकलक लिंकर विकल्प कुछ संकेत हैं? क्या यह ऐप्पल टूल्स में बग हो सकता है (हम सभी अपनी त्रुटियों के लिए एक बड़ी मछली को दोषी ठहराते हुए स्थिति में थे, सही?)
... और हाँ मैंने जीडीबी और एलएलडीबी के साथ प्रयास किया है। नतीजा वही था - कुछ क्या संकेत दे सकता है।
मैं एक minimalistic नमूना बनाने की कोशिश की है, लेकिन यह सिर्फ (वास्तव में) काम किया;)
धन्यवाद
मैंने एक बहुत ही बुनियादी अवलोकन किया है ... यदि मैं एक्सकोड (जीडीबी या एलएलडीबी) से सिम्युलेटर पर ऐप चलाता हूं तो मेरे लॉग संदेश 'dealloc' में मुद्रित नहीं होते हैं। अगर मैंने डीबगर छोड़ दिया है और सीधे सिम्युलेटर से ऐप लॉन्च किया है - Console.app सभी संदेशों को दिखाएं। बीच में कोई संकलन कोई संकलन नहीं है। अजीब। – simpleone
... और एक और अधिक सरल परिणाम ... यदि मैं एक डीबगिंग सत्र में एक्सकोड से ऐप चलाता हूं - अगर मैं सिम्युलेटर में मैन्युअल रूप से ऐप चलाता हूं और फिर डीबगर संलग्न करता हूं तो डेलोक को कॉल नहीं किया जाता है (लॉग मुद्रित नहीं किया जाता है)। सभी उम्मीद के अनुसार है। – simpleone