我的项目是一个混合静态库,用于显示带有一些JS来控制逻辑的UIWebView。当我使用64bit并在iOS 8/iPhone 6上运行演示时,内存不断增加到30M或更多!

  • 当我在工具中使用生成时,增加的内存使用量几乎全部来自webcore。这是否意味着JS代码泄漏?当我使用Safari直接运行类似的JS时,我找不到泄漏。
  • 当我释放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 *)

  • 我使用以下代码。
    -(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

    最佳答案

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

    请记住将WebKit导入到您的项目中,并且知道该功能仅在iOS8上可用。

    Apple Documentation

    10-05 22:11