我的项目是一个混合静态库,用于显示带有一些 JS 来控制逻辑的 UIWebView。在iOS 8/iPhone 6上使用64bit运行demo时,内存一直在30M以上!
我在instrument中使用generation时,增加的内存使用几乎全部来自webcore;这是否意味着JS代码中有泄漏?使用Safari直接运行类似的JS找不到泄漏。
当我释放 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
最佳答案
我遇到了同样的问题并切换到新的 WKWebView
,它立即解决了我看到的所有内存泄漏问题。 WKWebView
与 UIWebView
共享许多相同的调用名称,所以我在项目中所要做的就是将所有的“UIWebView”对象切换到“WKWebView”并且内存泄漏走了。
记得将 WebKit
导入您的项目,并且知道它仅适用于 iOS8
。
关于UIWebView 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28401650/