2016-12-26 92 views
2

我有一個UIWebView和裏面,我必須加載一個URL。如何使用UIWebView刪除內存泄漏?

問題是打開webView後發生內存泄漏。 我的意思是我無法刪除內存泄漏。

這下面是我的代碼: -

import UIKit 
import Toast_Swift 


class WebViewController: UIViewController,UIWebViewDelegate { 

//WebView 
@IBOutlet weak var webView: UIWebView! 

//URL 
var strUrl : String? = nil 

//Tag 
var tag : Int! = 0 

//ViewDidLoad 
override func viewDidLoad() { 
    super.viewDidLoad() 

    //Delegate of web view 
    webView.delegate = self 
    //webView.stringByEvaluatingJavaScript(from: "localStorage.clear();") 
    self.webView.loadRequest(URLRequest(url: URL(string: self.strUrl!)!)) 

    //Loading View 
    self.view.makeToastActivity(.center) 
} 

//MARK :- Web view delegate. 
func webViewDidFinishLoad(_ webView: UIWebView) { 

    //ToastManager.shared.tapToDismissEnabled = true 
    self.view.hideToastActivity() 
} 

//Button Back Action 
@IBAction func btnBack(_ sender: Any) { 


    if (tag == 1) { 
     webView.delegate = nil 
     self.strUrl = "" 
     webView.removeCache() 
     let gotoCreateView = self.storyboard?.instantiateViewController(withIdentifier: "CreateAccountView") as! CreateAccountView 

     self.present(gotoCreateView, animated: true, completion: nil) 

    } else { 

     webView.delegate = nil 
     self.strUrl = "" 
     webView.removeCache() 
     let gotoAboutUsView = self.storyboard?.instantiateViewController(withIdentifier: "AboutUsView") as! AboutUsView 

     self.present(gotoAboutUsView, animated: true, completion: nil) 
    } 


    /*if (1 == tag) 
    { 
     webView.delegate = nil 
     webView.removeCache() 
     let gotoCreateView = self.storyboard?.instantiateViewController(withIdentifier: "CreateAccountView") as! CreateAccountView 

     self.present(gotoCreateView, animated: true, completion: nil) 

    } 

    else 
    { 
     webView.delegate = nil 
     webView.removeCache() 
     let gotoAboutUsView = self.storyboard?.instantiateViewController(withIdentifier: "AboutUsView") as! AboutUsView 

     self.present(gotoAboutUsView, animated: true, completion: nil) 
    }*/ 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    webView.delegate = nil 
    webView.removeCache() 
    webView.delegate = self 
    self.webView.reload() 
} 
} 

extension UIWebView 
{ 
func removeCache() 
{ 
    URLCache.shared.removeAllCachedResponses() 
    URLCache.shared.diskCapacity = 0 
    URLCache.shared.memoryCapacity = 0 

    if let cookies = HTTPCookieStorage.shared.cookies { 
     for cookie in cookies { 
      HTTPCookieStorage.shared.deleteCookie(cookie) 
     } 
    } 
    } 
} 

我能做些什麼,以除去內存泄漏?

感謝

從您的代碼
+0

如果您的目標是ios 8.0或更高版本,那麼只需進入WKWebView即可。它比UIWebView有更好的內存管理。 – iAkki

+0

是的,但在故事板UIWebView可用? 謝謝 – kishor0011

+0

如果需要,您可以通過編程添加。最後記憶很重要! – iAkki

回答

2

除此之外,你需要得到以下幾點:

  1. 的第一件事情就是儘量不要在主視圖中添加web視圖,而不是這個你可以設置阿爾法或隱藏的財產。如果您使用的是隱藏屬性,那麼在取消隱藏時,將其委託設置爲零,並嘗試管理該隱藏的WebView在後臺無法工作。

  2. 如果您在新的ViewController中顯示,那麼當我們推送WebView時,設置它們的委託並重新加載請求。現在,當你試圖從這個觀點回來。在彈出之前,將其委託設置爲零,將nil設置爲所有在其中使用的局部變量。

例如:

在viewDidLoad中:您設置的委託, 現在,當你的流行,意味着移動到前面的屏幕使用這些代碼:

webView.delegate = nil 
    webView.removeCache() 

而且,

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    webView.delegate = nil 
    webView.removeCache() 
    webView.delegate = self 
    self.webView.reload() 
} 

} 

並在返回按鈕上:

@IBAction func btnBack(_ sender: Any) { 
    if (tag == 1) { 
     webView.delegate = nil 
     self.strUrl = "" 
     webView.removeCache() 
     let gotoCreateView = self.storyboard?.instantiateViewController(withIdentifier: "CreateAccountView") as! CreateAccountView 

     self.present(gotoCreateView, animated: true, completion: nil) 

    } else { 

     webView.delegate = nil 
     self.strUrl = "" 
     webView.removeCache() 
     let gotoAboutUsView = self.storyboard?.instantiateViewController(withIdentifier: "AboutUsView") as! AboutUsView 

     self.present(gotoAboutUsView, animated: true, completion: nil) 
    } 
} 
+0

我不確切地知道你在說什麼。 請解釋我的代碼或任何樣品。 因爲我不知道。 謝謝 – kishor0011

+0

根據你的解決方案,我編輯了我的問題。 請檢查一次。 這是正確的嗎? 我會檢查模擬器。 謝謝 – kishor0011

+0

我更新了一些代碼行...請在答案中看到... –