2013-05-06 5 views
16

द्वारा साफ़ नहीं किया गया है, मैं एक ऐसा एप्लीकेशन बना रहा हूं जो एक प्रकार की गैलरी है - यह एक पूर्णस्क्रीन दर्शक के रूप में विभिन्न मीडिया सामग्री दिखाता है। आवंटन उपकरण से पता चलता है कि एप्लिकेशन का उपयोग करते समय लाइव बाइट पैरामीटर 40 एमबी से अधिक नहीं बढ़ता है। इस बीच 20-30 बार पृष्ठों को स्लाइड करने के बाद ऐप 100% मारे जा रहा है। मैंने गंदा मेमोरी पैरामीटर की जांच की और पाया कि यह लाइव बाइट्स आकार से 10 गुना बड़ा था। और के उस गंदे स्मृति भस्म छवि आईओ सबसे:इमेजियो गंदे स्मृति को स्वचालित रूप से आईओएस

Screenshot http://i40.tinypic.com/25ge51i.jpg

संपादित करें, एक और स्क्रीनशॉट:

Screenshot http://i40.tinypic.com/9t1mh5.png

आवंटन चोटियों के ऊपर वीडियो/छवि मीडिया सामग्री करने जा रहे हैं। समस्या यह है कि गंदे स्मृति लगभग रैखिक रूप से बढ़ती है और मुझे इसे किसी भी तरह से रिलीज़ करने की आवश्यकता है।

अब एप्लिकेशन डिज़ाइन के बारे में। एप्लिकेशन स्क्रीन में एक क्षैतिज स्क्रॉल दृश्य है। स्क्रॉल व्यू में वीडियो या कोलाज ऑब्जेक्ट्स होते हैं जिनमें एकाधिक छवियां होती हैं। स्मृति को सहेजने के लिए केवल एक ही समय में तीन पृष्ठ बनाए जाते हैं - वर्तमान पृष्ठ और बाएं/दाएं पृष्ठ। इसलिए पृष्ठों को हमेशा स्क्रॉल दृश्य स्लाइड करते समय ऑन-फ्लाई बनाया और हटा दिया जाता है।

[UIImage imageWithContentOfFile: path] विधि का उपयोग करके लोड की गई सभी छवियां। कोलाज ऑब्जेक्ट स्टोर छवियों के अंदर UIImage उदाहरणों को स्टोर करता है। Dealloc विधि छवियों में ऐरे विशेषता साफ़ कर दिया गया है।

तो, सवाल:

  • यह [UIImage imageWithContentOfFile?]
  • में प्रणाली बग का एक प्रकार है यह छवि आईओ कैश है?
  • क्या मैं इसे साफ़ कर सकता हूं?
+0

यह आईओएस में एक बग नहीं है - अगर यह हज़ारों एप्लिकेशन काम नहीं कर रहा होता था। किसी भी तरह आपकी छवियां जारी नहीं हो रही हैं। –

+0

स्पष्ट रूप से मेरे प्रोग्राम में समस्या, लेकिन जैसा कि आप स्क्रीनशॉट में देख सकते हैं, उपयोगकर्ता मेमोरी सही ढंग से साफ़ हो जाती है (पहला चार्ट सीमित खपत दिखाता है)। दूसरी ओर, हम विशाल गंदे स्मृति वृद्धि देखते हैं। और मैं वास्तव में समझ में नहीं आता कि किस प्रकार की समस्या हो सकती है। वैसे, मैंने dealloc विधि लॉग इन किया और मैंने देखा कि इसे बुलाया गया था। – ZAN

+1

तो Image_IO के लिए प्रकटीकरण त्रिकोण क्या दिखाता है? यही है, सूची का पर्दाफाश करें और अपना प्रश्न अपडेट करें। –

उत्तर

19

एक टिप्पणी के लिए बहुत बड़ा के रूप में यहाँ इस लाना, बस कुछ विचार:

1) एक तरह से गलती से वस्तुओं को बनाए रखने की बार देखा गया है कि छिपा हुआ हो लेकिन उनके superview से नहीं हटाया में वस्तुओं के लिए है (और इस प्रकार बनाए रखा रहने)

2) अगर आप किसी भी धागे पर UIImageView आदि के साथ कुछ भी नहीं कर मुख्य थ्रेड बुरी चीजें (इस तरह)

3) भी हो सकता है अपनी परियोजना की नकल तो आप कर सकते हैं स्वतंत्र रूप से इसके साथ गड़बड़ है, और चीजों का एक गुच्छा कोशिश करें:

  • एकाधिक छवियों के बजाय, हमेशा एक ही छवि लोड करें, लेकिन अपने कोड के अन्य हिस्सों को छोड़ दें - चीजें बदलती हैं?

  • किसी भी उप-वर्ग में जो आप बनाते हैं वह छवियों को पकड़/रखेगा, डेलोक में एक लॉग संदेश डालने के लिए यह देखने के लिए कि वास्तव में उन वस्तुओं को हटा दिया जा रहा है या नहीं।

  • उपवर्ग UIImageView, छवियों के लिए इसका इस्तेमाल करते हैं, और लॉग dealloc

  • उपवर्ग UIImage, इन छवियों के लिए इसका इस्तेमाल करते हैं, लॉग dealloc

4) मैं एक कठिन समय चल रहा है विश्वास करने वाले छवि में एक दोष है जो ऐसा करेगा, लेकिन आप क्या कर सकते हैं छवि विथडेटा का उपयोग करने के लिए स्विच करें, और डेटा को स्वयं लोड करें। जब आप वास्तव में डेटा पढ़ते हैं तो F_NOCACHE ध्वज का उपयोग करें - ऐसा करने के तरीके पर SO पर अन्य कोड है, आप इसे खोज सकते हैं (मैंने उस पर एक प्रश्न का उत्तर दिया)।

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

+1

समस्या हल हो गई। UIImage उदाहरण लीक। मैं उन्हें [UIImage imageWithContentOfFile: पथ] का उपयोग करके बनाना चाहता था और ऑटोरेलीज पूल ने उन्हें समय पर रिलीज़ नहीं किया था। समस्या को स्पष्ट बनाए रखने/जारी करने के लिए स्विच करने के बाद। मेरे लिए सबसे कठिन हिस्सा आवंटन उपकरण अतिरिक्त स्मृति खपत नहीं दिखाया गया था। जहां तक ​​मैं देखता हूं, UIImage में बिटमैप डेटा नहीं है, लेकिन केवल छवियों का संदर्भ है जो गंदे स्मृति स्थान में स्थित था। डेविड के लिए बहुत धन्यवाद, उसने मुझे आश्वासन दिया कि यह केवल एक बरकरार समस्या थी, इसलिए अंततः मुझे लीक किए गए उदाहरण मिले। – ZAN

+0

मुझे वर्तमान में एक ही समस्या का सामना करना पड़ रहा है। हालांकि, मेरा ऐप एक छवि गैलरी नहीं है लेकिन एक साधारण UIWebView है। यह बढ़ती हुई ** गंदा स्मृति ** बनाता है जिनमें से अधिकांश छवि आईओ और प्रदर्शन उपकरण डेटा के कारण है। क्या आपको पता है कि मुझे खुदाई कहां शुरू करनी चाहिए? –

+0

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

0

डेविड एच के जवाब के अलावा मैं किसी को जो इस समस्या का सामना कर रहा है यह भी जांच करने के लिए यदि आपके दृश्य नियंत्रक, मॉडल की, UIDocument के (यदि आप इसका इस्तेमाल करते हैं) deinitializers कहा जाता है जब जरूरत नहीं की सिफारिश करेंगे।

यदि आपने इन कक्षाओं को सही तरीके से डिलीकेट नहीं किया है और उनमें छवि/वीडीओ/सामग्री डेटा है जो यूआईकिट इसे संदर्भित करता है, तो इसका परिणाम इस परिदृश्य में हो सकता है जहां आप VM: ImageIO मेमोरी उपयोग हमेशा बढ़ते रहते हैं, और फिर भी आप देखते हैं जब आप इंस्ट्रूमेंट्स का उपयोग करते हैं तो कोई स्मृति रिसाव नहीं होती है क्योंकि इन सामग्रियों को अब UIKit द्वारा आंतरिक रूप से बनाए रखा जाता है।

मैंने इस मुद्दे को दो बार भी अनुभव किया, और मेरे मामले में यह पता चला कि मेरे मॉडल के विनाशकारी को कभी भी असंबंधित मुद्दों के कारण बुलाया नहीं गया था। उन असंबद्ध मुद्दों को ठीक करके और सुनिश्चित करें कि मेरा मॉडल अस्वीकृत है, इन VM: ImageIO निरंतर विकास गायब हो गया।

enter image description here

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