web-dev-qa-db-ja.com

UIWebviewキャッシュのクリア

UIWebviewを使用してloadRequest:メソッドを使用してWebページをロードしました。そのシーンを離れると、[self.webView stopLoading];を呼び出してwebViewをリリースします。

初回起動時のアクティビティモニターでは、実際のメモリが4MB増加し、複数の起動/実際のメモリの読み込みでは増加しないことがわかりました。一度だけ増加しています。

WebViewの保持カウントを確認しました。それは適切、つまり0です。UIWebViewはいくつかのデータをキャッシュしていると思います。キャッシュを回避またはキャッシュされたデータを削除するにはどうすればよいですか?または、これには別の理由がありますか?

66

UIWebViewを閉じると、キャッシュされた情報が保持されると実際に考えています。 UIWebViewからUIViewControllerを削除して、リリースしてから、新しいものを作成しようとしました。新しいものは、すべてをリロードせずにアドレスに戻ったときの正確な位置を記憶していました(以前のUIWebViewがログインしていたことを思い出しました)。

いくつかの提案:

[[NSURLCache sharedURLCache] removeCachedResponseForRequest:NSURLRequest];

これにより、特定のリクエストのキャッシュされた応答が削除されます。 UIWebViewで実行されたすべての要求のすべてのキャッシュされた応答を削除する呼び出しもあります。

[[NSURLCache sharedURLCache] removeAllCachedResponses];

その後、UIWebViewで関連するCookieを削除してみてください:

for(NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {

    if([[cookie domain] isEqualToString:someNSStringUrlDomain]) {

        [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }
}

スウィフト3:

// Remove all cache 
URLCache.shared.removeAllCachedResponses()

// Delete any associated cookies     
if let cookies = HTTPCookieStorage.shared.cookies {
    for cookie in cookies {
        HTTPCookieStorage.shared.deleteCookie(cookie)
    }
}
125
groomsy

キャッシングを完全に無効にしないでください。アプリのパフォーマンスが低下するため、不要です。重要なことは、アプリの起動時にキャッシュを明示的に構成し、必要に応じてキャッシュを消去することです。

application:DidFinishLaunchingWithOptions:次のようにキャッシュ制限を構成します。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{   
    int cacheSizeMemory = 4*1024*1024; // 4MB
    int cacheSizeDisk = 32*1024*1024; // 32MB
    NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];
    [NSURLCache setSharedURLCache:sharedCache];

    // ... other launching code
}

適切に設定したら、キャッシュを削除する必要があるとき(たとえば、applicationDidReceiveMemoryWarningで、またはUIWebViewを閉じるときに)、次のようにします。

[[NSURLCache sharedURLCache] removeAllCachedResponses];

メモリが回復します。私はこの問題についてここにブログに書きました: http://twobitlabs.com/2012/01/ios-ipad-iphone-nsurlcache-uiwebview-memory-utilization/

45
ToddH

以下を実行して、キャッシュを無効にできます。

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];
9
InsertWittyName

スウィフト3。

// Remove all cache 
URLCache.shared.removeAllCachedResponses()

// Delete any associated cookies     
if let cookies = HTTPCookieStorage.shared.cookies {
    for cookie in cookies {
        HTTPCookieStorage.shared.deleteCookie(cookie)
    }
}
6
CodeOverRide

コードを変更できなかったので、テストの目的でコマンドラインが必要であり、これが誰かを助けることができると考えました。

アプリケーション固有のキャッシュは~/Library/Caches/<bundle-identifier-of-your-app>に保存されるため、以下のように削除して、アプリケーションを再度開きます。

rm -rf ~/Library/Caches/com.mycompany.appname/

2
PnotNP

私が経験した推測は、あなたが見ているメモリの使用はページのコンテンツからではなく、UIWebViewとそれのすべてがWebKitライブラリをサポートしているからです。 UIWebViewコントロールは大好きですが、非常に大きなコードブロックを取り込む「重い」コントロールです。

このコードは、iOS Safariブラウザーの大きなサブセットであり、静的構造体の大部分を初期化する可能性があります。

2
Chris Hawkins

さまざまな試みの後、これだけがうまくいきます(ios 8の下):

NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:1 diskCapacity:1 diskPath:nil];
[NSURLCache setSharedURLCache:cache];
1
Blasco73

Swift 2.0:

let cacheSizeMemory = 4*1024*1024; // 4MB
let cacheSizeDisk = 32*1024*1024; // 32MB
let sharedCache = NSURLCache(memoryCapacity: cacheSizeMemory, diskCapacity: cacheSizeDisk, diskPath: "nsurlcache")
NSURLCache.setSharedURLCache(sharedCache)
1
sebspi

Documentsからhtmlページを読み込んでいますが、同じ名前のcssファイルUIWebViewを持っている場合、以前のcssルールはスローされないようです。おそらく同じURLか何かを持っているからでしょう。

私はこれを試しました:

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];

私はこれを試しました:

[[NSURLCache sharedURLCache] removeAllCachedResponses];

私は最初のページをロードしています:

NSURLRequest *appReq = [NSURLRequest requestWithURL:appURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0];

キャッシュされたデータをスローすることを拒否します!イライラする!

PhoneGap(Cordova)アプリケーション内でこれを行っています。孤立したUIWebViewで試したことはありません。

Update1:​​this が見つかりました。
htmlファイルを変更することは非常に面倒です。

0
Evgeni Petrov