关于iOS的UIWebView内存泄露的问题,已经存在了很长时间。一直也没有什么好的解决方法。最近因公司的一个项目,因为内存问题一直闪退。为了解决这个问题,在网上找了很多方法,但是基本上都不怎么好用问题依旧。以前也碰到过这个问题,当时的解决方法就是设置NSURLCache大小。因为iOS当中的网络通讯默认都是通过NSURLConnection来实现的。所以UIWebView内部通讯也是通过NSURLConnection来下载网页资源的。
1
2
3
4
5
6
7
8
|
-
(
BOOL
)
application
:
(
UIApplication*
)
application
didFinishLaunchingWithOptions
:
(
NSDictionary*
)
launchOptions
{
int
cacheSizeMemory
=
1
*
1024
*
1024
;
// 4MB
int
cacheSizeDisk
=
5
*
1024
*
1024
;
// 32MB
NSURLCache *
sharedCache
=
[
[
[
NSURLCache
alloc
]
initWithMemoryCapacity
:
cacheSizeMemory
diskCapacity
:
cacheSizeDisk
diskPath
:
@
"nsurlcache"
]
autorelease
]
;
[
NSURLCache
setSharedURLCache
:
sharedCache
]
;
}
|
并且在收到内存警告的时候,清除缓存内容。
1
2
3
4
|
-
(
void
)
applicationDidReceiveMemoryWarning
:
(
UIApplication*
)
application
{
[
[
NSURLCache
sharedURLCache
]
removeAllCachedResponses
]
;
}
|
以及在释放UIWebView的时候
1
2
3
4
5
6
|
_webView
.
delegate
=
nil
;
[
_webView
loadHTMLString
:
@
""
baseURL
:
nil
]
;
[
_webView
stopLoading
]
;
[
_webView
removeFromSuperview
]
;
[
[
NSURLCache
sharedURLCache
]
removeAllCachedResponses
]
;
[
_webView
release
]
;
|
但是这么做基本上效果不是很大。囧啊。。
今天偶然的机会看到一篇国外的Blog文章,终于有种找到我想要的答案了。
原文地址是:http://blog.techno-barje.fr//post/2010/10/04/UIWebView-secrets-part1-memory-leaks-on-xmlhttprequest/
有兴趣的朋友可以去看看,大概说的内容就是Html当中的js代码会引起内存泄露的问题。
1
2
3
4
5
6
7
8
9
|
var
xmlhttp
=
new
XMLHttpRequest
(
)
;
xmlhttp
.
onreadystatechange
=
function
(
)
{
if
(
xmlhttp
.
readyState
==
4
&&
xmlhttp
.
status
==
200
)
{
// Do whatever you want with the result
}
}
;
xmlhttp
.
open
(
"GET"
,
"http://your.domain/your.request/..."
,
true
)
;
xmlhttp
.
send
(
)
;
|
解决这个问题的方法是在webViewDidFinishLoad方法中设置如下:
1
2
3
4
|
[
[
NSUserDefaults
standardUserDefaults
]
setInteger
:
0
forKey
:
@
"WebKitCacheModelPreferenceKey"
]
;
[
[
NSUserDefaults
standardUserDefaults
]
setBool
:
NO
forKey
:
@
"WebKitDiskImageCacheEnabled"
]
;
//自己添加的,原文没有提到。
[
[
NSUserDefaults
standardUserDefaults
]
setBool
:
NO
forKey
:
@
"WebKitOfflineWebApplicationCacheEnabled"
]
;
//自己添加的,原文没有提到。
[
[
NSUserDefaults
standardUserDefaults
]
synchronize
]
;
|
关于NSUserDefaults的另类用法还有比如设置UserAgent也可以通过NSUserDefaults来设置。