【问题标题】:How to remove memory leak using UIWebView?如何使用 UIWebView 消除内存泄漏?
【发布时间】:2017-05-10 16:31:48
【问题描述】:

我有一个 UIWebView,我必须在里面加载一个 url。

问题是打开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)
        }
    }
  }
}

如何消除内存泄漏?

谢谢

【问题讨论】:

  • 如果您的目标是 ios 8.0 或更高版本,请选择 WKWebView。它比 UIWebView 有更好的内存管理。
  • 是的,但在storyBoard UIWebView 可用?谢谢
  • 您可以根据需要以编程方式添加。最后记忆很重要!
  • 我该怎么办?还有在哪里加载?谢谢
  • 创建示例项目以测试两者并检查内存消耗的差异。过去我会遇到 UIWebView 问题,切换到 WKWebView 解决了所有与内存相关的问题。 See this for migrating to WKWebView

标签: ios swift http memory-leaks uiwebview


【解决方案1】:

除了你的代码,你还需要搞定这几点:

  1. 第一件事是尽量不要在主视图中添加 webView,而不是这个你可以设置 alpha 或 hidden 属性。如果您使用隐藏属性,则在取消隐藏时将其委托设置为 nil 并尝试管理 WebView 在隐藏时将无法在后台工作。

  2. 如果您在新的 ViewController 中显示,那么当我们推送 WebView 时,设置它们的委托并重新加载请求。现在,当您尝试从该视图返回时。在弹出之前,将它们的委托设置为 nil,将 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)
    }
}

【讨论】:

  • 我不知道你在说什么。请向我解释代码或任何示例。因为我不知道。谢谢
  • 根据您的解决方案,我编辑了我的问题。请检查一次。这是正确的吗?我将检查模拟器。谢谢
  • 我根据您的回答更新了我的问题。请检查一次。而且我运行的代码我不明白为什么内存不断增加。
猜你喜欢
  • 2015-04-08
  • 1970-01-01
  • 2013-11-13
  • 2015-10-14
  • 2011-09-19
  • 2010-10-13
  • 2011-04-08
  • 2011-09-26
相关资源
最近更新 更多