【发布时间】:2013-02-22 21:06:33
【问题描述】:
我一直在尝试了解 UIWebView 缓存的工作原理。因为我的目标是能够管理由 UIWebView 分配的内存(至少,尽可能多),以避免内存无限增加和应用程序因此而被杀死。
在readingotherstackoverflowquestions和searchingtheweb之后,我决定尝试NSURLCache sharedURLCache,但我不知道它到底是怎么回事有效。
我的测试场景是这样的:
我已经为 iOS 5 实现了一个测试应用程序,其中我有一个带有 UIWebView 的单一视图。这个 UiWebview 将像这样加载一个本地 index.html 文件:
// Create an NSString from the local HTML file
NSString *fullURL = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"www"];
NSURL *url = [NSURL fileURLWithPath:fullURL];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
// Load local HTML file
[self.webView loadRequest:requestObj];
在这个 index.html 文件中,我有一个 JS 脚本,它从 Flickr 下载一个 JSON,其中最后一张图片上传到了他们的公共提要。每个图像都附加到一个列表中。整个过程每秒重复一次,直到我们从提要中下载 1000 张图像。见代码:
var nImg = 0;
function getData()
{
$.getJSON('http://api.flickr.com/services/feeds/photos_public.gne?format=json&jsoncallback=?', function(data)
{
var items = [];
$.each(data.items, function(i, image) {
items.push('<li id="' + image.title + '"><img src="' + image.media.m + '"/></li>');
});
$('#page > #imagesList').append(items.join''));
nImg += items.length;
});
$('#page > #numImages').html(nImg);
if(nImg < 1000)
setTimeout("getData();", 1000); // Get more data in 1s
}
$(document).ready(function()
{
getData();
});
最后,在我的 AppDelegate 中,我按照post 中的说明设置了 sharedURLCache:
// Initialize the Cache, so we can control the amount of memory it utilizes
int cacheSizeMemory = 4*1024*1024; // 4MB
int cacheSizeDisk = 32*1024*1024; // 32MB
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
但是,不管它应该发生什么,当我打开仪器并运行应用程序检查分配时,内存在我们下载图像时不断增长(高达 20MB),而不是像我预期的那样扁平化在 4-6MB 左右如果 UIWebView 将使用此 sharedURLCache 来缓存下载的图像。
有人知道我做错了什么吗?我误解了什么吗?我加载页面错误吗? UIWebView 是否对 JS 中加载的图片使用了另一个缓存?
请告诉我你的想法。我真的需要了解这个 sharedURLCache 是如何工作的,以及 UIWebView 如何使用它来缓存 URLRequest、图像……以防万一它被使用。 我不希望有一个使用 UIWebView 可以不受控制地分配内存的 App。
【问题讨论】:
标签: ios memory-management uiwebview instruments nsurlcache