UIWebView キャッシュがどのように機能するかを理解しようとしています。私の目標は、UIWebViewによって割り当てられたメモリを(少なくとも、可能な限り)管理できるようにすることであるため、メモリが無期限に増加し、これが原因でアプリが強制終了されるのを回避します。
他のスタックオーバーフローの質問を読んで webを検索した後、 NSURLCache sharedURLCacheを試すことにしましたが、それが実際にどのように機能するのかわかりません。
私のテストシナリオは次のとおりです。
内部に UIWebView を持つ単一のビューがあるiOS 5用のテスト アプリを実装しました。この 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ファイルには、Flickr から JSON をダウンロードし、パブリック フィードにアップロードされた最後の画像を含む JS スクリプトがあります。各画像はリストに追加されます。フィードから 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 で、この投稿に書かれているように 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) メモリが増え続けます。この sharedURLCache を使用して、ダウンロードした画像をキャッシュします。
誰かが私が間違っていることを知っていますか? 私は何か誤解していますか?ページの読み込みが間違っていますか? UIWebView は、JS に読み込まれた画像に別のキャッシュを使用しますか?
あなたの考えを教えてください。この sharedURLCache がどのように機能するか、UIWebView がそれを使用して URLRequest や画像などをキャッシュする方法を理解する必要があります。コントロールなしでメモリを割り当てることができる UIWebView を使用するアプリは必要ありません。