2017-01-10 10 views
5

मैं क्या नहीं समझ सकता इंटरनेट में लगभग हर सभ्य ट्यूटोरियल पढ़ने के लिए कोशिश की है, लेकिन अभी भी लगता है वास्तव में यहाँ क्या हो रहा है: enter image description hereउपकरणों का उपयोग करना मेमोरी लीक

मैं "सिस्टम पुस्तकालय छुपाएं" है और " कॉल पेड़ को घुमाएं ", लेकिन मुझे समझ में नहीं आता कि इस लीक के लिए जिम्मेदार वास्तविक कोड कैसे प्राप्त करें। किसी भी सुझाव की सराहना की जाती है। हो सकता है कि मैं कुछ स्पष्ट याद कर रहा हूँ। मुझे सैकड़ों रिसाव मिल रही हैं, हालांकि मैं बंद होने में weak का उपयोग कर रहा हूं, मेरे पास एक दूसरे के संदर्भ में कक्षाएं नहीं हैं। लेकिन ऐसा लगता है कि मुझे कुछ मौलिक याद आ रही है।

+0

मैं भी एक ही समस्या का सामना करना पड़ रहा हूँ: निम्न आलेख में अतिरिक्त जानकारी है। – iTamilan

उत्तर

1

आपके स्क्रीनशॉट में दिखाई गई समस्या यह है कि उपकरण आपके ऐप के डिबग प्रतीकों को नहीं ढूंढ सकते हैं। उपकरण फ़ंक्शन नामों के बजाय मेमोरी पतों को दिखा रहा है। आप फ़ंक्शन नामों के बिना इंस्ट्रूमेंट्स में अपनी मेमोरी लीक का स्रोत नहीं ढूंढ पाएंगे, भले ही आप कॉल पेड़ को घुमाएं और सिस्टम लाइब्रेरी छुपाएं।

सुनिश्चित करें कि आपकी परियोजना डीबग प्रतीकों का निर्माण कर रही है। जांचें कि जेनरेट डीबग सिंबल बिल्डिंग सेटिंग हां पर सेट है। यदि आपकी प्रोजेक्ट डीबग प्रतीकों का निर्माण कर रही है, तो उपकरण डीएसआईजीएम फ़ाइल को खोजने में असमर्थ हो सकते हैं जिसमें डीबग प्रतीक शामिल हैं। इंस्ट्रूमेंट्स में इंस्ट्रूमेंट> कॉल ट्री> डीएसवाईएम का पता लगाएं। डीएसवाईएम आमतौर पर रिलीज संस्करण के एप्लिकेशन बंडल के समान निर्देशिका में होता है।

Instruments: Locating dSYM Files

+0

ठीक है, मैंने सबकुछ किया है, लेकिन "यूयूआईडी/एपनाम/यूबीआईडी ​​से libdyld.dylib के लिए मेल नहीं खाता" के साथ आयात करने पर ढेर है, नहीं गूगल में ज्यादा जानकारी, कोई सुझाव? – JuicyFruit

+0

मैंने इसे बनाया है! आपका बहुत बहुत धन्यवाद! वह जो मैं याद कर रहा था – JuicyFruit

1

मेमोरी लीक को ट्रैक करना मुश्किल हो सकता है। यह एक समय लेने वाली प्रक्रिया होने जा रहा है, इसलिए तैयार रहें। अंत में, आमतौर पर मेमोरी लीक डीबगिंग के साथ बहुत सारे परीक्षण और त्रुटि होती है। "मेमोरी लीक" उपकरण ने वास्तव में अतीत में केवल मेरे लिए एक रिसाव का पता लगाया है। मुझे हमेशा "आवंटन" उपकरण का उपयोग करके उन्हें नीचे ट्रैक करना पड़ा।

अतीत में मेरी मदद करने वाली चीजों में से एक यह पता लगाने की कोशिश कर रहा है कि वास्तव में कौन सी वस्तुओं को लीक किया जा रहा है। आवंटन उपकरण ("लीक चेक" के ऊपर की पंक्ति) पर क्लिक करें। अब जारी वस्तुओं की संख्या या इस्तेमाल की गई स्मृति की मात्रा से सॉर्ट करने का प्रयास करें। देखें कि क्या ऐसी कोई वस्तुएं हैं जिनकी संख्या 0 की गिनती है जब उन्हें चारों ओर चिपकना नहीं चाहिए। देखें कि कोई ऑब्जेक्ट प्रकार है जो असामान्य मात्रा में स्मृति ले रहा है।

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

यदि आपका आवेदन ठीक काम कर रहा है, तो आपको इन्हें ठीक करने के बारे में चिंता करने की आवश्यकता नहीं हो सकती है। यहां कुछ लागत लाभ विश्लेषण है जो आप यहां करना चाहते हैं। यदि यह प्रदर्शन या स्थिरता को प्रभावित नहीं कर रहा है, तो क्या यह अभी आपको मामूली लाभों के लायक बनाने में समय निवेश है जो आपको और आपके उपयोगकर्ताओं को प्रदान करेगा?

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

+0

यहां मेरा दूसरा प्रश्न आता है: वे क्यों होते हैं? मेरा ऐप लापरवाही नहीं कर रहा है, यह ठीक काम करता है, लेकिन फिर भी मैं उन वर्गों को अपने वर्गों से भी नहीं ले रहा हूं, लेकिन कुछ पुस्तकालयों, 'UIViews' और मैं कल्पना नहीं कर सकता कि और क्या।मैं 'क्लासए' <-> 'क्लासबी' और '[कमजोर स्व]' को बंद कर देता हूं, बंदियों की तरह, लेकिन और क्या? – JuicyFruit

+0

लेकिन, खेद है कि मैंने नोटिस नहीं किया है, मैं स्विफ्ट और एआरसी का उपयोग कर रहा हूं, मेरे सभी 'UIViewControllers'' deinit() 'हैं, इसलिए यहां मेरी वास्तविक समस्या है: यदि UIViewController' जारी किया गया है तो स्मृति में क्या छोड़ा गया है? इसमें सभी को रिहा नहीं किया जाना चाहिए और यदि नहीं - तो क्या यह स्मृति में नहीं होना चाहिए? – JuicyFruit

+0

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

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