2012-01-20 62 views
4

我有一個iPad應用程序(IOS 4.3 & 5.0),每次用戶頁面向前或向後創建UIView時至少有2個子視圖。 2個子視圖是UIWebView對象。UIWebView內存泄漏

在每個相關的滑動操作中,舊的UIWebView會被正確地移除和釋放(removeFromSuperview然後stopLoading並將委託設置爲nil),並且釋放父UIView。我可以確認父UIView和2個子UIWebViews都完全沒有了。

我可以在網頁瀏覽中看到保留數,因爲它們被刪除,我確信它們確實每次都被刪除。 但是,我的內存分配在每次刷卡時會繼續增加〜200-350k。儀器沒有泄漏,但我可以看到內存使用量緩慢上升。 在iPad 1上,應用程序最終(在中等使用情況下6-10分鐘內)會收到多個內存警告並終止。 LowMemory崩潰日誌等等。

我們使用stringByEvaluatingJavaScriptFromString和loadRequest來填充Webviews。即使沒有任何內容被注入或加載到webView中,內存使用量也會增加。

是否有人用UIWebViews體驗這種行爲?有沒有人處理過這個成功?

雖然,評論&答案將不勝感激。

+0

你正在從超級視圖中刪除,停止加載,並將委託設置爲零,但你確定*你沒有額外的保留在這些網頁瀏覽?可能你沒有考慮'@property(nonatomic,retain)'? – Tim

+0

嗨,你有沒有碰運氣? –

+1

循環參考。我的意見之一仍然掛在控制器上。畢竟經典的記憶體非常經典,但在大型代碼庫中很難處理。 – smaura777

回答

0

不知道有任何泄漏,但是如果您每次刷卡都要銷燬並重新創建相同的視圖層次,爲什麼不存儲視圖並重新使用它們呢?

無論他們是否泄漏,webviews的設置在計算上都很昂貴,因此重新使用它們並重新加載內容應該會提升性能,並且可能會解決泄漏問題。

+0

這不是一個真正的選擇,是的,我做到了這一點,內存分配仍然在每次滑動上升 – smaura777

+0

http://stackoverflow.com/a/5056158/990618 –

1

嘗試使用儀器,但使用「分配」模板並觀看UIWebView的「#Living」列。我通常使用這樣的:與分配模板

  1. 檔案應用
  2. 前往通所有選項卡「警告了」應用程序,滾動瀏覽等
  3. 按「馬克堆」,這將創建一個「基線」 heapshot
  4. 你認爲原因對象呆在身邊
  5. 按「馬克堆」了,這將創建一個「Heapshop#」的東西heapshot
  6. 檢查在「Heapshop#」,這將顯示對象大小和創建的對象的數量自上次堆積後活着。
  7. 轉到4
+0

我一直在做這個過去一週,它是很明顯,即使在webview發佈之後,webviews中的某些內容仍然存在。一旦我禁用了所有的網頁瀏覽器,問題幾乎消失了。 – smaura777

+0

好的,你會發現#生活中不斷有很多物體在上升? –

0

你還看到這個問題嗎?我跟蹤的東西,看起來像無限的內存使用量(不一定泄漏,但我得到的低內存警告和最終進程終止)通過調用stringByEvaluatingJavaScriptFromString一遍又一遍:

[webview stringByEvaluatingJavaScriptFromString:@"something()"]; 

好像有一些奇怪的存在。

+0

我正在使用這種方法,我也看到了。不幸的是,我不能用其他東西來代替它。 – smaura777