2016-12-26 6 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

Да, но в storyBoard доступен интерфейс UIWebView? Thanks – kishor0011

+0

Вы можете добавить программно, если хотите. Наконец, память имеет значение! – iAkki

ответ

2

Помимо кода, вам необходимо получить следующие моменты:

  1. Первым делом попытайтесь не добавить WebView в главном окне, вместо этого вы можете установить альфа или скрытая собственность. Если вы используете скрытое свойство, то на unhiding сделайте свой делегат нулевым и попытайтесь управлять тем, что 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

У меня есть некоторые строки кода ... см. В ответе ... –

 Смежные вопросы

  • Нет связанных вопросов^_^