2010-06-01 64 views
18

我有一個內存管理問題。UIWebView內存管理

我正在開發一個大量使用UIWebView的應用程序。這個應用程序從我的服務器加載內容時動態生成大量的UIWebViews。其中一些UIWebView非常大,並且有很多圖片。

如果我使用儀器檢測泄漏,我沒有發現任何泄漏。然而,許多對象被分配,我懷疑這與UIWebViews有關。

由於不再需要webviews版本,因此似乎並非所有內存都已發佈。我的意思是,在向我的服務器發送請求之後,應用程序創建了一個UITableView和許多webviews(樂器約8Mb)。當用戶點擊後,所有這些都釋放,但內存使用量只減少約2-3 Mb,並在使用應用程序5-10分鐘後崩潰。

我錯過了什麼嗎? 任何人都知道會發生什麼?

謝謝!

+0

能否請你看看我這裏的解決方案:http://stackoverflow.com/questions/3582908/uiwebview-and-huge-memory-loss/ 21250327#21250327 – NeverHopeless 2014-01-21 06:18:05

回答

0

如果在viewcontroller的同一實例內添加多個子視圖,則必須在添加新的子視圖之前從超級視圖中刪除舊的子視圖。

標籤添加到一個UIWebView你添加它作爲一個子視圖之前:

webView.tag = 10; 
[self.view addSubview:webView]; 

webView = nil; 

在添加新的WebView(這將清除舊的視圖),從上海華刪除子視圖:

UIWebView * oldWebView = (UIWebView *)[self.view viewWithTag:10]; 
[oldWebView removeFromSuperview]; 

如果您不從superview中移除舊的Web瀏覽器,它們將在內存中建立,直到您釋放視圖控制器。

5

嘗試增加

[webView loadHTMLString: @"" baseURL: nil]; 

您釋放的WebView權利之前。對於4.2.1中有關在UIWebView中顯示PDF的泄漏,這爲我解決了大部分泄漏問題。

+0

在webview中使用更多圖像時面臨同樣的問題。如何解決這個弧 – 2013-05-01 05:08:53

7

這不是一個解決方案,而是您面臨的問題的可能解釋。

我的內存問題與我工作的應用程序有關。它包含(實際上)一個滾動視圖,包含3個全屏大小的Web視圖。每個網頁視圖的內容大小都是多個屏幕,平均說10個。

當您加載webview時,整個視圖呈現在內存中。因此,除了用於加載圖像和其他數據的內存(您在儀器中看到的內容)之外,Web視圖本身在呈現無法控制的情況下會使用內存。

因此,例如,768×1024一個web視圖,用10頁的內容將使用

768 * 1024 * 10(頁)* 4(每像素的比特)= 31457280 = 30MB。

乘以3個網頁瀏覽量,這是90MB直接使用在應用程序分配的內存之上。

使用虛擬機跟蹤器工具,您可以感受到在儀器中使用了多少內存。

+0

這是一個很好的方法:http://stackoverflow.com/questions/10163879/ways-to-improve-uiwebview-scrolling-performance – CarlJ 2012-06-11 19:43:16

1

寫在你的viewWillDisappear方法:

[WebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]]; 
+3

我downvoted,因爲這沒有提供任何解釋。這可能是對的,也可能不是,但沒有任何解釋,你不應該相信答案。 – 2012-09-08 22:13:01

+0

@RoyLeban對不起,從我身邊的過錯我很抱歉,現在我添加了說明謝謝:) – 2013-01-25 12:46:49

+1

我下調了這一個,因爲如果網頁在iPhone上顯示視頻,它通過全屏顯示視頻播放器。這會觸發willDisappear方法,從UIWebView中移除當前網頁,並使視頻立即停止播放。 – Ash 2013-06-20 11:28:08