UIWebView 内存泄漏
Memory leak with UIWebView
我的项目是一个混合静态库,用于显示带有一些 JS 的 UIWebView 来控制逻辑。当我在iOS 8/iPhone 6上使用64位和运行演示时,内存一直在30M或更多!
我在instrument中使用generation时,增加的内存占用几乎全部来自于webcore;这是否意味着 JS 代码中存在泄漏?直接用Safari转运行类似JS找不到漏洞
当我释放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
,它立即解决了我遇到的所有内存泄漏问题。 WKWebView
与 UIWebView
共享许多相同的调用名称,因此我在我的项目中所要做的就是将所有“UIWebView”对象切换到 'WKWebView',内存泄漏就消失了。
记得将 WebKit
导入您的项目,并且知道它仅在 iOS8
上可用。
我遇到了类似的问题,让用户通过在 UIWebView 中预览图像来测试应用程序。应用会在 N 次预览后崩溃。将 Apple Instruments 工具与分配分析模板结合使用。通过该工具,我能够 select 以下分配寿命:"Created & Persistent"。进一步观察是多次预览同一文件时,Persistent Bytes(根据苹果定义,这是已分配但未释放的字节数。)对于 ImageIO_jpeg_Data 保持双倍增长,对于任何其他图像类型。
一个解决方案是使用 apple 的 UIImageView 作为单独的图像预览器,这样在预览图像时根本不会出现内存泄漏。
我的项目是一个混合静态库,用于显示带有一些 JS 的 UIWebView 来控制逻辑。当我在iOS 8/iPhone 6上使用64位和运行演示时,内存一直在30M或更多!
我在instrument中使用generation时,增加的内存占用几乎全部来自于webcore;这是否意味着 JS 代码中存在泄漏?直接用Safari转运行类似JS找不到漏洞
当我释放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
,它立即解决了我遇到的所有内存泄漏问题。 WKWebView
与 UIWebView
共享许多相同的调用名称,因此我在我的项目中所要做的就是将所有“UIWebView”对象切换到 'WKWebView',内存泄漏就消失了。
记得将 WebKit
导入您的项目,并且知道它仅在 iOS8
上可用。
我遇到了类似的问题,让用户通过在 UIWebView 中预览图像来测试应用程序。应用会在 N 次预览后崩溃。将 Apple Instruments 工具与分配分析模板结合使用。通过该工具,我能够 select 以下分配寿命:"Created & Persistent"。进一步观察是多次预览同一文件时,Persistent Bytes(根据苹果定义,这是已分配但未释放的字节数。)对于 ImageIO_jpeg_Data 保持双倍增长,对于任何其他图像类型。
一个解决方案是使用 apple 的 UIImageView 作为单独的图像预览器,这样在预览图像时根本不会出现内存泄漏。