UIWebView 内存泄漏

标签 memory uiwebview dealloc

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

  1. 我在instrument中使用generation时,增加的内存使用几乎全部来自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() 常量
    • 3 WebCore WebCore::SharedBuffer::data() 常量
    • 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 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28401650/

相关文章:

C# Entity Framework 内存使用率高,内存泄漏?

c - 指数问题及其 C 表示

ios - UIWebView 中的动态字体大小

ubuntu - MemFree 和 MemAvailable 之间的区别

python - 如何检查 python xarray Dataset/DataArray 对象是否已加载到内存中,或者是否仍指向磁盘上的数据?

iphone - UIPageviewController PDF

ios - 我已经成功地将 Storyboard UIWebView 连接到 iPhone 的 Controller ,但不能为 iPad 连接

objective-c - 如何正确分配/释放这个指针? objective-c

ios - 在 Objective-C 中取消分配对象的属性

Objective-C 释放类别中声明的属性?