2012-08-05 9 views
10

के साथ मेमोरी लीक मैं लीक का एक गुच्छा तय करने की कोशिश कर रहा हूं कि मेरा UIWebView कारण है और न ही उनके मूल और न ही कामकाज को ढूंढ सकता है।UIWebView और जावास्क्रिप्ट

NSString* body = <some HTML>; 
NSString* html = [NSString stringWithFormat:kHTMLTemplate, [self scripts], [self styles], body]; 
[_webView loadHTMLString:html 
       baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]]; 

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

उपकरण एक बहुत ही अजीब पैटर्न जिसमें सभी लीक वस्तुओं विभिन्न आकारों और कोई भी उनमें से कोई भी जानकारी इसे से जुड़ी है की आम-खंड हैं पता चलता , नए रिसाव जोड़े गए हैं।

ऐसा लगता है कि एसओ में कई धागे हैं। लगभग UIWebView स्मृति लीकिंग। मैंने पाया कि सभी सुझावों का प्रयास किया है (उदाहरण के लिए, NSURLCache को शून्य पर सेट करना, या इसे रीसेट करना; मैंने मौजूदा UIWebView को रिलीज़ करने का प्रयास किया और प्रत्येक बार जब मेरा नया डेटा इत्यादि हो तो ताजा आवंटित किया गया) लेकिन कुछ भी मदद नहीं मिली है।

मेरी जांच अब तक एक स्पष्ट परिणाम की ओर ले जाती है: ऐसा लगता है कि लीक केवल तभी मौजूद हैं जब एचटीएमएल में दृश्य में लोड होता है तो इसमें कुछ जावास्क्रिप्ट होता है। यदि आप ऊपर html स्ट्रिंग देखते हैं, तो यह कई घटकों से बना है;

return @"<script type='text/javascript' src='jquery-1.4.4.min.js'></script>" 
     "<script type='text/javascript' src='jmy.js'></script>"; 

यदि मैं यह निकालने के लिए, कोई लीक कर रहे हैं: एक एक समारोह कि बस रिटर्न है जो [self scripts] है। लेकिन जैसे ही मैं अपने एचटीएमएल में <script> टैग जोड़ता हूं, लीक दिखाई देते हैं।

return @"<script type='text/javascript' src='jquery-1.4.4.min.js'></script>"; 

तो, सवाल: अगर मैं बस jQuery फ़ाइल (या किसी अन्य js फ़ाइल, इस के रूप में) में शामिल हैं वे भी दिखाई है किसी को भी यहाँ क्या हो रहा है के बारे में एक विचार? स्पष्ट रूप से मेरे एचटीएमएल में जावास्क्रिप्ट फ़ाइल सहित UIWebView रिसाव मेमोरी बना रहा है।

तथ्य यह है कि लीक दिखाई दोनों जब मैं एक ही UIWebView वस्तु का पुन: उपयोग या जब मैं एक नया एक हर बार मैं सामग्री है दृष्टांत, मुझे सुराग को लगता है कि वहाँ रास्ता जावास्क्रिप्ट फ़ाइलें loadHTMLString जो सुराग द्वारा नियंत्रित किया जाता है में कुछ किया जाना चाहिए रिसाव के लिए।

क्या किसी को पता है कि यह कैसे तय किया जा सकता है?

enter image description here

+0

यह UIWebView में एक बग हो सकता है। http://blog.techno-barje.fr/post/2010/10/04/UIWebView-secrets-part1-memory-leaks-on-xmlhttprequest/ –

+0

@ एच 2CO3: धन्यवाद, मैंने यह भी कोशिश की ... कोई सुधार नहीं। .. – sergio

+0

लगता है कि हम आईओएस 8 द्वारा सहेजे गए हैं। WKWebView http://stackoverflow.com/questions/16514230/massive-memory-leak-in-ios-uiwebview पर इस उत्तर को चेक करें –

उत्तर

11

मैं अंत में क्या हो रहा है पर और सभी एक समाधान है कि मैं साझा करना चाहते हैं ऊपर कुछ सुराग मिल गया।

मैं पुष्टि कर सकता हूं कि कुछ जावास्क्रिप्ट फ़ाइल का सरल समावेशन वेब दृश्य के पुनः लोड पर स्मृति रिसाव का कारण बन रहा था। मैंने HTML सामग्री के साथ एक फ़ाइल बनाने का प्रयास किया, फिर इसे UIWebView में loadRequest के माध्यम से लोड किया, और reload के माध्यम से इसे पुनः लोड किया; लीक हमेशा वहाँ थे। मैं उसके लिए एक रडार पोस्ट करूंगा।

वेब व्यू की सामग्री को अपडेट करने के लिए मुझे innerHTML का उपयोग करके बचाया गया था।reload या loadHTMLString पर भरोसा करने के बजाय, मैं एक खाली शरीर के साथ अपने वेब दृश्य प्रारंभ (मेरा मतलब है, head खंड वहाँ सभी आवश्यक जे एस/सीएसएस फ़ाइलों सहित था,) तो यह document.body.innerHTML की स्थापना अद्यतन:

body = [body stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""]; 
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"setBody(\"%@\");", body]]; 
setBody साथ

इस तरह परिभाषित किया गया:

var setBody = function(body) { 
    document.body.innerHTML = body; 
} 

मैं दो लाभ प्राप्त: वेब दृश्य अद्यतन वास्तव में तेजी से बन गया है (यह डोम, जो दूसरी ओर पूरे पर पूरी तरह से वांछनीय नहीं है अद्यतन करने नहीं का प्रभाव है), और वहाँ उपकरण के तहत ऐप चलाने की कोई स्मृति रिसाव नहीं थी। कमी यह थी कि मुझे कुछ स्थितियों को ठीक करना था जहां ऐप ठीक चल रहा था; विशेष रूप से:

  1. (यहां तक ​​कि एक खाली शरीर पेज के साथ) वेब दृश्य लोड हो रहा है एक बहुत ले, तो आप DOM के तैयार होने के लिए अपनी सामग्री के पहले अद्यतन सिंक्रनाइज़ करने के लिए है,

  2. webViewDidFinishLoading विश्वसनीय नहीं लगता है: इसे document.readyStatecomplete से पहले निष्पादित किया गया है;

  3. document.documentElement.height, पेज ऊंचाई पुन: प्राप्त करने की आधिकारिक तरीका विश्वसनीय नहीं है, भी लगता है: वैकल्पिक हल body भाग के "गणना शैली" हो रही है और इसकी height मूल्य पढ़ा जाता है।

उम्मीद है कि यह किसी और की मदद करता है जो पाता है कि उसके वेब विचार स्मृति को लीक कर रहे हैं।