2010-03-04 11 views
7

मैं मेमोरी लीक देखने के लिए उपकरणों का उपयोग करता हूं। कम से कम एक परिदृश्य में जहां मैं लगातार स्लाइड/पृष्ठों (UIScrollView के अंदर) के माध्यम से फिसल रहा हूं, मुझे कोई स्मृति रिसाव दिखाई नहीं दे रहा है। उपकरणों का उपयोग करना - "आवंटन जीवनकाल" के तहत मैं "& अभी भी जीवित" देखने के लिए स्विच करता हूं और पूरे 1.17 एमबी मेमोरी को देखता हूं। मुझे लगता है कि इसका मतलब है कि मेरा ऐप केवल इतना वास्तविक स्मृति का उपयोग कर रहा है और बाकी का सही ढंग से पुनर्नवीनीकरण किया जा रहा है।मेमोरी चेतावनी और दुर्घटना: इसे कैसे संभालें

फिर भी 100 या तो पृष्ठों के माध्यम से फिसलने के बाद, मुझे स्मृति चेतावनी मिलती है और फिर मेरे कुछ विचार अनलोड किए जाते हैं जिसके परिणामस्वरूप पूरे ऐप का दुर्घटना हो जाती है।

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

+0

नहीं अभी भी सुराग। शायद 'इंस्ट्रूमेंट्स' मेरे पास कुछ रिसाव की उचित रिपोर्ट नहीं कर रहा है। क्या अन्य मेमोरी लीक टूल्स टूल्स हैं जो अधिक विश्वसनीय हैं? – climbon

उत्तर

11

The documentation says:

एक मिलान छवि वस्तु कैश में पहले से ही नहीं है, तो इस विधि निर्दिष्ट फ़ाइल से छवि डेटा लोड करता है, यह कैश, और फिर जिसके परिणामस्वरूप वस्तु देता है।

इस प्रकार, imageNamed: का उपयोग करके आप जो भी छवि लोड करते हैं, वह आपके अंतिम स्वामित्व को जारी करने के बाद कैश में मौजूद रहेगी।

उपकरण इसे रिसाव के रूप में नहीं दिखाते हैं क्योंकि, कड़ाई से बोलना, यह एक नहीं है: कुछ (UIImage) अभी भी इन छवियों के बारे में जानता है। लीक उपकरण केवल एक वस्तु के लिए एक रिसाव दिखाएगा जो मौजूद है लेकिन कुछ भी नहीं जानता है।

हालांकि आप इसे अभी भी उपकरण में देख सकते हैं।

  1. अपने ट्रेस दस्तावेज़ में ऑब्जेक्टऑलोक उपकरण का चयन करें और वर्तमान गणना द्वारा कक्षाओं की सूची को क्रमबद्ध करें, या वर्तमान कुल आकार से क्रमबद्ध करें। आप देखेंगे कि स्मृति का बड़ा हिस्सा UIImage ऑब्जेक्ट्स पर कब्जा कर लिया गया है।
  2. यदि आप UIImage पंक्ति के लिए क्लास-नाम कॉलम पर माउस रखते हैं, तो आपको एक ➲ (go-to-iTunes-Store) आइकन दिखाई देगा; यदि आप उस पर क्लिक करते हैं, तो आप अपने सभी UIImage उदाहरणों की एक सूची देखेंगे।
  3. फिर, यदि आप किसी उदाहरण की पंक्ति के लिए पता कॉलम पर माउस रखते हैं, तो आप एक ही बटन देखेंगे; इस बार, उस पर क्लिक करने से आपको उस पते के इतिहास में ले जाया जाएगा, जिसमें उस पते के साथ ऑब्जेक्ट्स की सभी रचनाएं, प्रतिधारण, रिलीज और डिलीोकेशन शामिल हैं।

    यहां, आप छवि आवंटन (यूआईएममेज क्लास के भीतर, आपके द्वारा कुछ स्टैक-फ्रेम नीचे दिए गए क्रम में), प्रतिधारण (आपके द्वारा), और रिलीज (आपके द्वारा) देख सकते हैं। आप यह भी देख सकते हैं कि इसे UIImage द्वारा जारी नहीं किया गया है- +[UIImage imageNamed:] कैश अभी भी छवि का मालिक है, इसलिए "रिसाव"।

आप छवियों कि तरह पाइल नहीं करना चाहते हैं, तो उन्हें अपने imageWithContentsOfFile: और the -[NSBundle pathForResource:ofType:] method का उपयोग करके लोड।

अद्यतन: मैंने पढ़ा है कि आईओएस 3 के बाद से, UIImage (कम से कम कुछ) कम स्मृति स्थितियों में अपने कैश साफ करेगा, तो यह एक "रिसाव" के रूप में ज्यादा के रूप में यह हुआ करता था नहीं होना चाहिए। आप शायद अभी भी मेमोरी ढेर देखेंगे, लेकिन फिर आपको अंततः ढेर के पतन को देखना चाहिए। यदि आप अभी भी स्मृति को पिलिंग देखते हैं और साबित कर सकते हैं कि यह ऐप्पल की गलती है, तो आपको अपने सबूत और file a bug दस्तावेज करना चाहिए।

+0

एक लाख बार आपको धन्यवाद! – RanLearns

0

समस्या का स्रोत मिला। यह निम्नलिखित टुकड़ा

UIImage *image = [UIImage imageNamed:imageFile]; 

cartoon = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 40.0, 320, 280)]; 

cartoon.image = image ; 
cartoon.backgroundColor = [UIColor brownColor]; 

मैं छवियों के 100s के साथ साथ प्रत्येक पृष्ठ पर कुछ पाठ और उपयोगकर्ता है उंगली flicking (बस की तरह वे iphone के फ़ोटो एप्लिकेशन में करते हैं) द्वारा उन के माध्यम से स्क्रॉल कर सकते हैं में है। मैं केवल अपने UIScrollView में 3 पेज बनाता हूं और जिसे मैंने स्पष्ट रूप से आवंटित किया है, लोड/अनलोड (और रिलीज़) भी करता हूं। तो जब कार्टून रिलीज करने की बात आती है तो मैं बस कार्टून यूआईएममेज व्यू जारी करता हूं और यूआईएममेज सोचता हूं कि यह ऑटो रिलीज़ नहीं होगा।

लेकिन ऐसा लगता है कि इसे ऑटो रिलीज़ नहीं किया जा रहा है। मेरे ऐप को मेमोरी चेतावनी मिलती है (मैं कोई कार्रवाई नहीं करता) और ओएस क्रैश के कारण मेरे विचारों को उतार देता है।

जब मैं दो पंक्तियों (नीचे संशोधित स्निपेट) पर टिप्पणी करता हूं, तो समस्या दूर हो जाती है। कोई चेतावनी नहीं दुर्घटनाग्रस्त।

//UIImage *image = [UIImage imageNamed:imageFile]; 

cartoon = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 40.0, 320, 280)]; 

//cartoon.image = image ; 
cartoon.backgroundColor = [UIColor brownColor]; 

क्या कोई इस मुद्दे को हल करने के बारे में जानता है? चेतावनी होती है जब UIImage से रिलीज मेमोरी को मजबूर करने का कोई तरीका है?

+0

इसे ऑटोरेलेज्ड किया जा रहा है। यह सिर्फ कुछ और के स्वामित्व में है। आप उपकरण में व्यक्तिगत UIImage उदाहरणों को देख कर इसे देख सकते हैं। –

2

क्या आपके पास NSZombieEnabled पर्यावरण चर सेट है? यह विलुप्त वस्तुओं को स्मृति में बने रहने का कारण बनता है, इस प्रकार आप स्मृति को वापस पाने की अनुमति नहीं देते हैं। इसलिए सक्रिय होने पर इसे अक्षम करने का प्रयास करें।

1

क्या आपने जांच की है कि आप सभी आईबीओलेट ऑब्जेक्ट्स को रिलीज़ करते हैं? अपने डीलोक पर आपको किसी ऑब्जेक्ट ऑब्जेक्ट को आपके ऑब्जेक्ट में रिलीज़ करना चाहिए, भले ही उनके पास संश्लेषण विधि न हो।

हमें एक ही समस्या है और हमने इसे सभी आईबीओटलेट जारी करने का हल किया है। आप केवल 3 पृष्ठ हैं

Check this answer in Stack Overflow

1

मैं समझता हूँ कि आप कुछ आइटम पुन: उपयोग कर रहे हैं।

शेष कोड के बिना यह कहना मुश्किल है कि क्या गलत हो रहा है, लेकिन शायद आपको एक नया निर्माण करने से पहले कार्टून ऑब्जेक्ट को रिलीज़ करने का प्रयास करना चाहिए। इस तरह

कोशिश कुछ:

IImage *image = [UIImage imageNamed:imageFile]; 

if (cartoon!=nil) 
    [cartoon release]; 

cartoon = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 40.0, 320, 280)]; 

cartoon.image = image ; 
cartoon.backgroundColor = [UIColor brownColor]; 
संबंधित मुद्दे