UIWebView 内存泄漏

Memory leak with UIWebView

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

  1. 我在instrument中使用generation时,增加的内存占用几乎全部来自于webcore;这是否意味着 JS 代码中存在泄漏?直接用Safari转运行类似JS找不到漏洞

  2. 当我释放UIWebView时,内存还没有释放;我测试了仪器分配。有一些 webcore 和 (non-object) 还在内存中,我该怎么做才能释放它们?

    • 0JavaScriptCore WTF::MallocHook::recordAllocation(void*, unsigned long)
    • 1 个 JavaScriptCore WTF::fastMalloc(无符号长)
    • 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;
}

我研究了以下链接,但它们似乎没有解决我的问题。 iOS 8 中的 UIWebview 是否仍在泄漏?当我在 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

我遇到了类似的问题,让用户通过在 UIWebView 中预览图像来测试应用程序。应用会在 N 次预览后崩溃。将 Apple Instruments 工具与分配分析模板结合使用。通过该工具,我能够 select 以下分配寿命:"Created & Persistent"。进一步观察是多次预览同一文件时,Persistent Bytes(根据苹果定义,这是已分配但未释放的字节数。)对于 ImageIO_jpeg_Data 保持双倍增长,对于任何其他图像类型。

一个解决方案是使用 apple 的 UIImageView 作为单独的图像预览器,这样在预览图像时根本不会出现内存泄漏。