2017-07-25 9 views
13

दिखा रहा है मैं एक परियोजना के लिए एक्सकोड मेमोरी ग्राफ उपकरण देख रहा हूं और कुछ अजीब व्यवहार को देख रहा था। उम्मीद है कि किसी को यह समझाने में सक्षम हो सकता है कि क्या हो रहा है/अगर मुझे चिंता करने की ज़रूरत है।एक्सकोड डीबग मेमोरी ग्राफ़ रिलीज ऑब्जेक्ट

मेरे पास एक व्यू कंट्रोलर है जो कुछ ऑब्जेक्ट बनाता है (जो इस समय बहुत कुछ नहीं कर रहे हैं) जब मैं व्यू कंट्रोलर को खारिज कर देता हूं तो निश्चित रूप से वे रिलीज़ हो जाते हैं। लेकिन एक (कभी कभी दोनों) दृश्य डीबगर में चारों ओर लटका करने लगते हैं:

enter image description here

केवल दो कभी बनाए जा रहे हैं, और दोनों deinitialized किया जा रहा है, मेरे consol में इस बात की पुष्टि कर रहे हैं:

enter image description here

मुझे लगता है कि मैं कहने में सही हूं, मैं ऊपर दी गई छवि में User ऑब्जेक्ट का संदर्भ देने वाली किसी भी ऑब्जेक्ट के लिए ज़िम्मेदार नहीं हूं, तो क्या यह एक बग है, या सिर्फ कुछ है जिसके बारे में मुझे चिंता करने की आवश्यकता नहीं है?

+0

अभी भी यह समस्या है? –

उत्तर

0

ऑब्जेक्ट की डीनिट विधि से "जारी उपयोगकर्ता" लॉग किया गया था? यदि ऐसा है, तो वस्तुओं को परिभाषित किया गया था, इसलिए जो भी संदर्भ दिखा रहे हैं वहां वस्तु को जीवित रखने में सक्षम नहीं थे। यह देखते हुए कि, शायद मैं इसके बारे में चिंता नहीं करता, हालांकि यदि आप सुनिश्चित करना चाहते हैं, तो सबसे अच्छा काम करना है उपकरण को आग लगाना, आवंटन उपकरण लोड करना, रन बटन पर विकल्प-क्लिक करें, और "रिकॉर्ड संदर्भ संख्याएं जांचें । " यह आपको यह देखने की अनुमति देगा कि आपकी वस्तुओं को बनाए रखने और जारी करने के लिए क्या है।

1

यदि आप वर्णित ग्राफ में किसी भी वस्तु के लिए ज़िम्मेदार नहीं हैं, जो उपयोगकर्ता ऑब्जेक्ट को बनाए रखने वाले हैं, तो आपको इसके बारे में चिंता नहीं करनी चाहिए।

एफवाईआई: ऐप पर फायरबेस के साथ पहले मुझे लीक का अनुभव हुआ है। यह तुम्हारी गलती नहीं है, और यह बहुत सारी याददाश्त नहीं लेनी चाहिए।

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

+0

इसे अपने googleservice-info.plist FIREBASE_ANALYTICS_COLLECTION_ENABLED = NO में जोड़ें, यह शायद लीक –

0

मुझे यकीन नहीं है कि यह आपके साथ क्या हो रहा है, लेकिन यह मेरे साथ हुआ है और यह स्विफ्ट के आंतरिक मेमोरी मॉडल का परिणाम बन गया है, विशेष रूप से यह कमजोर और प्रसिद्ध संदर्भों को कैसे प्रबंधित करता है।

आपके लिए आवेदन करने के लिए, आपके उपयोगकर्ता ऑब्जेक्ट को कमजोर या अप्रत्याशित संदर्भ होना चाहिए।

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

हां, एक वस्तु को नष्ट कर दिया जा सकता है लेकिन अस्वीकृत नहीं किया जा सकता है! इसका कारण यह है कि इस वस्तु को इंगित करने वाले कमजोर या अप्रत्याशित संदर्भ को अस्वीकृत (या बदतर, पुनः आवंटित) स्मृति पर इंगित करने की अनुमति नहीं दी जानी चाहिए, क्योंकि इस सूचक के बाद "असुरक्षित" व्यवहार उत्पन्न होगा। नतीजतन, स्मृति के इस खंड को छोड़ दिया नहीं जा सकता है और इस प्रकार वस्तु को हटाया नहीं जाता है।

हालांकि, अच्छी खबरों के दो टुकड़े। सबसे पहले, केवल उस विशिष्ट वस्तु को लीक किया जा रहा है - किसी भी वस्तु का संदर्भ नहीं है। इसका मतलब है कि केवल एक छोटी सी स्मृति लीक हो रही है। तो यह एक बड़ा सौदा नहीं हो सकता है। दूसरा, कमजोर संदर्भों के लिए, स्विफ्ट 4 में यह व्यवहार बदल गया है (खेदजनक रूप से प्रसिद्ध संदर्भों में अभी भी यह व्यवहार होगा)।Xcode9 बीटा में अपनी परियोजना को आजमाएं और देखें कि यह अभी भी होता है या नहीं।

यह सब डब्ल्यूडब्ल्यूडीसी में एक ही प्रकार के प्रश्न पूछने से है। उम्मीद है कि यह लागू हो जाता है!

+0

अंतर्दृष्टिपूर्ण उत्तर के लिए धन्यवाद। इस मामले में मुझे नहीं लगता कि कोई कमजोर या प्रसिद्ध संदर्भ आयोजित किए जा रहे हैं। मैंने वास्तव में इस उदाहरण के लिए व्यवहार को दोहराने के लिए अंत में एक पूरी तरह से खाली परियोजना बनाई। परियोजना में जो कुछ भी था वह मूल रूप से खाली 'उपयोगकर्ता' वर्ग और 'व्यू कंट्रोलर' था। इन परिणामों के साथ समाप्त हो गया। वैसे भी धन्यवाद। –

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