ved*_*ucm 6 memory-management instruments uiwebview nsurlcache ios
我一直试图了解UIWebView缓存的工作原理.因为我的目标是能够管理UIWebView分配的内存(至少,尽可能多),以避免无限期地内存提升和App因此而被杀死.
后读 其他 计算器 问题和搜索 的 网站,我决定尝试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];
Run Code Online (Sandbox Code Playgroud)
在这个index.html文件中,我有一个JS脚本,可以从Flickr下载JSON,最后一个图像上传到他们的公共源.每个图像都附加到列表中.整个过程每秒重复一次,直到我们从Feed中下载了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();
});
Run Code Online (Sandbox Code Playgroud)
最后,在我的AppDelegate中,我按照以下文章中的说明设置了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];
Run Code Online (Sandbox Code Playgroud)
但是,尽管应该发生这种情况,当我打开仪器并运行应用程序检查分配时,内存会在我们下载图像(最多20MB)时保持增长,而不是像我期望的那样,如果UIWebView那么扁平化大约4-6MB将使用此sharedURLCache缓存下载的图像.

有人知道我做错了什么吗?我误解了什么吗?我加载页面错了吗?UIWebView是否为JS中加载的图像使用另一个缓存?
请让我知道你的想法.我真的需要了解这个sharedURLCache是如何工作的,以及UIWebView如何使用它来缓存URLRequest,图像......以防万一它被使用.我不希望有一个使用UIWebView的应用程序可以在没有控制的情况下分配内存.
小智 1
你最后是怎么处理这个问题的?\n我注意到你*sharedCache initWithMemoryCapacity有一个diskPath论点,\'s nil。
来自苹果文档:
\n\n\n\n\n在 iOS 中,path 是应用程序\xe2\x80\x99s\n 默认缓存目录的子目录名称,用于存储磁盘缓存(如果子目录不存在,则创建\n 子目录)。
\n
查看 Two Bit Labs 提供的有关如何使用缓存的链接:\n http://twobitlabs.com/2012/01/ios-ipad-iphone-nsurlcache-uiwebview-memory-utilization/
\n\n配置共享缓存
\n\n首先,让\xe2\x80\x99s 在应用程序启动时(发出任何请求之前)配置缓存,以便我们可以控制它使用的内存量。在你的 UIApplicationDelegate 中:
\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { \n int cacheSizeMemory = 4*1024*1024; // 4MB\n int cacheSizeDisk = 32*1024*1024; // 32MB\n NSURLCache *sharedCache = [[[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"] autorelease];\n [NSURLCache setSharedURLCache:sharedCache];\n...\nRun Code Online (Sandbox Code Playgroud)\n\n上面配置了 4MB 内存缓存和 32MB 磁盘缓存。磁盘缓存将驻留在默认的 iOS 缓存目录中名为 \xe2\x80\x9cnsurlcache\xe2\x80\x9d 的子目录中。
\n\n响应内存警告
\n\n我们在使用 Web 视图的应用程序中看到的最常见的崩溃原因是,当出现内存警告时,由于没有释放足够的内存而被弹出。当您的应用程序收到内存警告时,您应该清除共享缓存以释放内存。在您的 UIApplicationDelegate 中执行此操作:
\n\n- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {\n [[NSURLCache sharedURLCache] removeAllCachedResponses];\n}\nRun Code Online (Sandbox Code Playgroud)\n\n现在,当您在分析器中运行应用程序时,您应该会看到内存利用率趋于平缓,如果您在模拟器中触发内存警告,您应该会看到内存使用率下降。
\n| 归档时间: |
|
| 查看次数: |
4631 次 |
| 最近记录: |