UIWebView导致内存泄漏

时间:2015-02-09 01:47:28

标签: memory uiwebview dealloc

我的项目是一个混合静态库,用于显示带有一些JS来控制逻辑的UIWebView。当我在iOS 8 / iPhone 6上使用64位并运行demo时,内存将保持在30M或更高!

  1. 当我在乐器中使用世代时,增加的内存使用量几乎全部来自webcore;这是否意味着JS代码中存在泄漏?当我使用Safari直接运行类似的JS时,我找不到泄漏。

  2. 当我发布UIWebView时,内存仍未释放;我用仪器分配测试了。内存中还有一些webcore和(非对象),我可以做些什么来释放它们?

    • 0JavaScriptCore WTF :: MallocHook :: recordAllocation(void *,unsigned long)
    • 1 JavaScriptCore WTF :: fastMalloc(unsigned long)
    • 2 WebCore WebCore :: SharedBuffer :: buffer()const
    • 3 WebCore WebCore :: SharedBuffer :: data()const
    • 4 WebCore WebCore :: ResourceLoader :: didReceiveDataOrBuffer(char const *,unsigned int,WTF :: PassRefPtr,long long,WebCore :: DataPayloadType)
    • 5 WebCore WebCore :: SubresourceLoader :: didReceiveDataOrBuffer(char const *,int,WTF :: PassRefPtr,long long,WebCore :: DataPayloadType)
    • 6 WebCore WebCore :: SubresourceLoader :: didReceiveBuffer(WTF :: PassRefPtr,long long,WebCore :: DataPayloadType)
    • 7 WebCore WebCore :: ResourceLoader :: didReceiveBuffer(WebCore :: ResourceHandle *,WTF :: PassRefPtr,int)
    • 8 WebCore WebCore :: SynchronousResourceHandleCFURLConnectionDelegate :: didReceiveDataArray(__ CFArray const *)
  3. 我使用以下代码。

    -(void)createUIWebview{
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:serviceUrl]]];
    }
    
    - (void)webViewDidFinishLoad:(UIWebView *)webView
    {
    [[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"WebKitCacheModelPreferenceKey"];
    }
    
    -(void)dealloc{
    if (_webView.isLoading){
        [_webView stopLoading];
    }
    [_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]];
    _webView.delegate=nil;
    [_webView removeFromSuperview];
    [_webView release];
    _webView = nil;
    }
    

    我研究了以下链接,但它们似乎没有解决我的问题。 UIWebview在iOS 8中仍然存在泄漏吗?当我在iPhone4中使用iOS 6时,问题似乎并不那么明显。

    Whats the proper way to release a UIWebView?

    iOS 8 UIWebView memory management

    UIWebView leaks, JS Garbage Collector & WebCore VMs

    Release memory/cookie/cache from UIWebView once closed

2 个答案:

答案 0 :(得分:6)

我遇到了同样的问题,并切换到新的WKWebView,它立即解决了我看到的所有内存泄漏问题。 WKWebViewUIWebView共享许多相同的调用名称,因此我在项目中所做的就是将所有`UIWebView'对象切换为'WKWebView',并且内存泄漏消失了。

请务必将WebKit导入您的项目,并知道该项目仅在iOS8上提供。

Apple Documentation

答案 1 :(得分:0)

我遇到了类似的问题,让用户通过在UIWebView中预览图像来测试应用程序。 N预览后应用程序会崩溃。使用Apple Instruments工具和分配概要分析模板。通过该工具,我可以选择以下分配寿命:"创建&持久&#34 ;.进一步的观察是多次预览同一个文件,持久字节(基于苹果定义,这是已经分配但未释放的字节数)。对于ImageIO_jpeg_Data,在双打中保持增长,对于任何其他图像类型都是如此

对此的解决方案是使用Apple的UIImageView作为图像的单独预览器,这在预览图像时不会造成任何内存泄漏。