2014-09-27 12 views
6

मेरे पास रूट नियंत्रक की भूमिका में एक साधारण तालिका दृश्य के साथ एक पदानुक्रमित अनुप्रयोग (नेविगेशन नियंत्रक) है। प्रत्येक बार जब आप कोई सेल चुनते हैं, तो आपको विवरण के बारे में कुछ जानकारी के साथ एक नया दृश्य मिला है (DetailViewController द्वारा प्रबंधित)। DetailViewController के दृश्य के किनारे मेरे पास इंटरनेट से डेटा प्रदर्शित करने के लिए UIWebView है। लेकिन समस्या तब होती है जब मैं स्मृति उपयोग को देखता हूं। UiWebView के माध्यम से वेब से लोड की गई सामग्री के साथ DetailViewController का प्रत्येक नया खोला गया दृश्य गुणांक का उपयोग करके अधिक स्मृति लाता है। जब मैं अपने रूट नियंत्रक के दृश्य पर वापस आ जाता हूं तो मैं उस डेटा के लिए आवंटित स्मृति को सब कुछ अनलोड करना चाहता हूं।आईओएस 8 UIWebView मेमोरी प्रबंधन

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

अग्रिम धन्यवाद!

उत्तर

9

कुछ चीजें ध्यान देने योग्य हैं। UIWebView "लीक"। यह कम से कम आईओएस 4 के बाद से लीक हो रहा है। प्रत्येक बड़े पृष्ठ लोड के साथ, ऐसा लगता है, और UIWebView ऑब्जेक्ट स्वयं जारी होने पर स्मृति पूरी तरह से ठीक नहीं हो जाती है। चाहे यह स्मृति कैश में बनी रहती है और वास्तव में आवश्यक होने पर रिलीज़ होती है, या रिसाव, मैं सही ढंग से जवाब देने में सक्षम नहीं हूं। यह वर्षों में कुछ हद तक सुधार हुआ है, लेकिन अभी भी इंस्ट्रूमेंट्स मेमोरी आवंटन ग्राफ का उपयोग करके देखा जा सकता है।

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

  • पुन: उपयोग वेब दृश्य के रूप में ज्यादा:

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

  • हमने देखा है कि हम वेब दृश्य से जितना अधिक निकाल सकते हैं, UIWebView ऑब्जेक्ट को जारी करने से पहले एक खाली पृष्ठ खोल रहा था।
  • आईओएस 8 वेबकिट के साथ काम करने के साथ एक नए मॉडल का समर्थन करता है: WKWebView (वेबकिट 2)। इस मॉडल में, वेब सामग्री को प्रबंधित और ऑफ-प्रोसेस तैयार किया जाता है, और उस प्रक्रिया में स्मृति "लीक" होती है। जब आवश्यक हो, ओएस इन वेबकिट प्रक्रिया को मार देगा, इस प्रकार आपके ऐप को चलाने की अनुमति होगी। आप इसे आजमा सकते हैं और देख सकते हैं कि आपके पास सुधार है या नहीं।
संबंधित मुद्दे