2012-09-19 34 views
23

मैं अपने कोड में एक और मेमोरी लीक ढूंढने की कोशिश कर रहा हूं, और मुझे लगता है कि सीजी रास्टर डेटा क्या है। स्वचालित स्नैपशॉट सक्षम के साथ वीएम ट्रैकर के माध्यम से जाने के दौरान, सीजी रास्टर डेटा एकमात्र ऐसा हिस्सा प्रतीत होता है जो बढ़ता है। ये आवंटन के बिना तेजी से बढ़ते हैं।सीजी रास्टर डेटा क्या है?

मुझे पूरा यकीन नहीं है कि सीजी रास्टर डेटा क्या है, न ही मैं इसे कैसे ठीक करूँगा, लेकिन इस बिंदु पर बढ़ते पदचिह्न अंततः स्मृति त्रुटि और दुर्घटना का कारण बनता है, इसलिए यह अच्छा नहीं है! मैं अपना खुद का टेक्स्ट प्रतिपादन करता हूं (कोरटेक्स्ट का उपयोग करके), इसलिए मैं सोच रहा हूं कि इसके साथ कुछ करने के लिए कुछ है। मैं चित्र लोड भी कर रहा हूं?

नीचे पदचिह्न की एक छवि है: Peaks in the allocations when the pages load (the app loads pages with images and text discretely), the dirty memory always increases though.

अद्यतन: "। NSConcreteGlyphGenerator" यह समस्या अभी भी बनी रहती है, लेकिन काफी दिलचस्प है कि मैं कुछ कहा जाता है UIFoundations के भीतर एक रिसाव के लिए यह सहसंबंधी कर सकते हैं ऐसा लगता है कि जब मैं कोरटेक्स्ट विधि में एक जिम्मेदार स्ट्रिंग पर "बाउंडिंगआरक्ट विथसाइज:" विधि को कॉल करता हूं जो वास्तव में खींचता है। ...

[displayString boundingRectWithSize:CGSizeMake(self.frame.size.width, self.frame.size.height) options:0 context:nil]; 

धीरे धीरे यह ट्रैकिंग नीचे

+4

क्या आपने कभी कभी आंकड़ा किया था यह एक बाहर है? मुझे अभी भी आईओएस 7 में यह समस्या है। – Daniel

+0

इस पर कोई अपडेट? @Daniel –

उत्तर

1

यह एक जवाब के बहुत है, लेकिन सिर्फ इसलिए किसी को जांच शुरू कर दी हो जाता है नहीं है ...

मुझे लगता है कि: लाइन, विशेष रूप से, है सीजी रास्टर डेटा आईओएस 6 के साथ नया है, लेकिन आईओएस 5 में सीजी छवि के रूप में मौजूद था। मैंने दोनों सिमुलेटर पर परीक्षण किया, और आईओएस 5 पर, सीजी रास्टर डेटा मौजूद नहीं था, लेकिन यदि आप आईओएस 6 और आईओएस 5 की कुल रकम की तुलना करते हैं, तो सीजी छवि सीजी रास्टर डेटा के बराबर है, और सीजी छवि नहीं है आईओएस 6 पर दिखाएं। तो मुझे पूरा यकीन है कि उन्होंने सीजी छवि को सीजी रास्टर डेटा में बदल दिया है।

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

+0

"सीजी छवि" अभी भी मौजूद है आईओएस 6, कम से कम मेरे ऐप में। –

+0

हां, मुझे भी के लिए, हालांकि iOS 5 में it..whereas की अत्यंत सूक्ष्म निशान यह लगभग 20 एमबी है, IOS 6 अपने 32 केबी अधिकतम में। तो जो भी सीजी छवि है, यह आईओएस 6 – Snowman

12

मुझे "सीजी रास्टर डेटा" में सबकुछ नहीं पता है, लेकिन एक चीज जो मुझे पता है, इसमें यह है कि ... रोलर डेटा, उर्फ ​​बिटमैप्स को स्टोर करने के लिए कोर ग्राफिक्स द्वारा आवंटित स्मृति है।

विशेष रूप से, मेरे ऐप में, मैं CGBitmapContextCreate का उपयोग करके दो 256x256 बिटमैप संदर्भ बना देता हूं। मैं NULL को data पैरामीटर के रूप में पास करता हूं, ताकि कोर ग्राफिक्स मेरे लिए बिटमैप मेमोरी आवंटित कर सके। प्रति पिक्सेल 32 बिट्स (4 बाइट्स) के साथ 256x256 बिटमैप प्रत्येक केबीबी के 256 कीबी = 64 पेज लेता है। इंस्ट्रूमेंट्स में, मुझे 65 पृष्ठों के दो "सीजी रास्टर डेटा" ब्लॉक मिलते हैं। अगर मैं उन बिटमैप संदर्भों में से किसी एक को टिप्पणी करता हूं, तो मुझे इंस्ट्रूमेंट्स में केवल एक 65-पेज "सीजी रास्टर डेटा" ब्लॉक मिलता है।

दूसरी तरफ, मेरे पास मेरे ऐप में CATiledLayer भी है। CATiledLayer मेरे लिए अपने ग्राफिक्स संदर्भों को स्थापित करने के लिए सेट करता है, और मेरा मानना ​​है कि यह साझा स्मृति का उपयोग करके उन संदर्भों को बनाता है जो आईओएस 5 पर आईओएस 5, backboard पर विंडो सर्वर (springboard) सीधे पहुंचता है। मुझे उन ग्राफिक्स संदर्भों के अनुरूप कोई भी "सीजी रास्टर डेटा" ब्लॉक नहीं दिख रहा है।

0

यदि आप स्मृति उपयोग (89 एमबी) के बारे में चिंतित हैं तो थोड़ा सा है। क्या आपने सिम्युलेटर (सिम्युलेटर> हार्डवेयर> मेमोरी चेतावनी अनुकरण) में मेमोरी चेतावनी अनुकरण करने का प्रयास किया है?

मेरा अनुमान है कि यह चित्र छवियों द्वारा उपयोग की जा रही स्मृति है।

संभावना है कि आप स्मृति चेतावनी संदेश को देख कर आपकी छवियों पुनःआवंटन करना पड़ सकता है कर रहे हैं:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; 

सब अपनी छवि handleMemoryWarning विधि में वस्तुओं को साफ़ करें।

+0

में सभी बड़ी छवियों को साफ़ करने के लिए उस बड़ी भूमिका में नहीं खेलती है? मतलब 'छवि = शून्य'? या 'self.view = nil'? – aircraft

2

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

संक्षेप में: यदि आप तटरक्षक रेखापुंज डेटा के साथ मेमोरी लीक देख रहे हैं, उन लोगों के साथ देखा गया हो सकता है, और सुनिश्चित करें कि वे जारी किया जा रहा हैं दृश्य नियंत्रकों को देखो।

0
नहीं

वास्तव में एक जवाब। लेकिन कुछ और संकेत है कि मैं पता लगा जबकि मेरी सीजी-रेखापुंज-डेटा-रिसाव को सुलझाने:

  • सीजी-रेखापुंज-डेटा CGIMageRefs की स्मृति रखती है (कम से कम CGBitmapContextCreate द्वारा बनाई गई एक संदर्भ से CGBitmapContextCreateImage() से बनाए गए (शून्य, ...)
  • मेरी रिसाव एक लापता CGImageRelease()। मैं एक CALayer की सामग्री के रूप में पारित करने के लिए छवि का इस्तेमाल किया और मान लिया है कि इस संपत्ति संदर्भ रखती है। लेकिन ऐसा लगता है कि इस काम प्रतियां छवि। पर था कम से कम मुझे CGImageRelease को असाइनमेंट के ठीक बाद कॉल करने में कोई समस्या नहीं है।

आशा है कि किसी की मदद करें ...

1

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

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

+0

मुझे लगता है कि एक बहुत ही समान समस्या है। क्या आप किसी छवि को एनएससीएच में रखने के साथ समस्या पर विस्तार कर सकते हैं? – Kenneth