2014-09-27 96 views
6

我有一個層次結構的應用程序(NavigationController),它具有根控制器角色中的簡單表視圖。每次選擇任何單元格時,都會得到一個新的視圖,其中包含有關細節的一些信息(由DetailViewController管理)。在DetailViewController的視圖方面,我有一個UIWebView來顯示來自Internet的數據。但是當我查看內存使用情況時會發生問題。 DetailViewController的每個新打開的視圖以及通過UiWebView從Web上加載的內容帶來更多的內存使用係數。當我回到根控制器的視圖時,我想卸載所有內容並釋放爲該數據分配的內存。iOS 8 UIWebView內存管理

如何管理該問題?我試圖stopLoading: UIWebView的實例方法來保存一些內存,但它也不能解決問題。除了我沒有完全理解ARC的工作過程外,如果通常每個新打開的詳細視圖都使用係數增加內存,我無法保證自己。

預先感謝您!

回答

9

有幾件事要注意。 UIWebView「泄漏」。至少iOS4以來一直在泄漏。隨着每個大頁面的加載,它似乎會增長,並且在發佈對象本身時,內存不會完全正確補充。無論這種內存是否保留在緩存中並在真正需要時釋放,或泄漏,我都無法正確回答。多年來這已經有所改善,但仍然可以使用儀器的內存分配圖來看。

讓我們從基礎開始。在開始對設計進行更改之前,請嘗試使用「樂器」來查看究竟是什麼泄漏。您也可以繼承您的視圖和視圖控制器,實現它們的dealloc方法,並確保它們在預期的情況下被正確釋放。很多時候,特別是涉及塊時,人們會創建保留週期,這會導致巨大的內存泄漏。先做這件事。

下面是我的經驗與WebKit的工作了幾個建議:

  • 重用Web視圖儘可能。如果可以,請使用相同的對象,並將其添加爲視圖控制器視圖的子視圖。
  • 我們注意到,我們可以從網頁視圖中排除的最多是在釋放UIWebView對象之前打開一個空白頁面。
  • iOS8支持使用WebKit的新模型:WKWebView(WebKit2)。在這個模型中,網絡內容被管理和撤銷,並且在這個過程中內存被「泄漏」。需要時,操作系統將終止這些WebKit進程,從而允許您的應用運行。你可以試試看看你是否有改進。