最近在写资讯详情页面,采用内嵌HTML页面时,多次进入详情页面后崩溃,用insturmemt检测也检测到内存泄露,发现是javascript代码导致内存泄露。
通常情况下,当你在UIWebView执行这个Javascript时,你将有一个大的内存使用和泄漏大量的数据, 同时,由于webView采用的是网页加载,从web的角度来讲,会存在缓存,参考文章http://www.sjsjw.com/kf_web/article/027020ABA031849.asp
事实上,导致此泄漏的关键属性是的 WebKitCacheModelPreferenceKey。当你在一个UIWebView打开一个链接,这个属性被自动设置为“1”值 。因此,解决的办法是每当你打开一个链接时把它设回0:
通常情况下,当你在UIWebView执行这个Javascript时,你将有一个大的内存使用和泄漏大量的数据, 同时,由于webView采用的是网页加载,从web的角度来讲,会存在缓存,参考文章http://www.sjsjw.com/kf_web/article/027020ABA031849.asp
<span style="font-size:14px;">function loadata()
{
totalheight = parseFloat($(window).height()) + parseFloat($(window).scrollTop());
var kk={"ID":id,"isnotdeletealink":iol,"pageNum":pagenum,"type":"pageData","version":510};
if ($(document).height() <= totalheight)
{
if(fact==true){
fact=false;
$.ajax({
type: 'POST',
url: "http://api.ios.d.cn/api-news/NewsInfoByJson.ashx",
data: kk,
dataType: 'html',
success: function (data) {
document.location='loadnextpage://';
fact=true;
$("div.body").append(data);
pagenum++;
set();
loading();
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(errorThrown);
}
});
}
}
}</span>
解决方法:事实上,导致此泄漏的关键属性是的 WebKitCacheModelPreferenceKey。当你在一个UIWebView打开一个链接,这个属性被自动设置为“1”值 。因此,解决的办法是每当你打开一个链接时把它设回0:
<span style="font-size:14px;">- (void)webViewDidFinishLoad:(UIWebView *)webView{
[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"WebKitCacheModelPreferenceKey"];
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"WebKitDiskImageCacheEnabled"];//自己添加的,原文没有提到。
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"WebKitOfflineWebApplicationCacheEnabled"];//自己添加的,原文没有提到。
[[NSUserDefaults standardUserDefaults] synchronize];
if (IS_PHONE) {
self.imageURLArray=[[[NSMutableArray alloc]initWithArray:[self getWebViewPictureUrlString]]autorelease];
dispatch_queue_t queue=dispatch_queue_create("imagedownload", NULL);
dispatch_async(queue, ^{
[self asynRequestForImageArr:self.imageURLArray fromIndex:0];
});
dispatch_release(queue);
}
}
</span>