UIWebviewを使用してloadRequest:
メソッドを使用してWebページをロードしました。そのシーンを離れると、[self.webView stopLoading];
を呼び出してwebViewをリリースします。
初回起動時のアクティビティモニターでは、実際のメモリが4MB増加し、複数の起動/実際のメモリの読み込みでは増加しないことがわかりました。一度だけ増加しています。
WebViewの保持カウントを確認しました。それは適切、つまり0です。UIWebViewはいくつかのデータをキャッシュしていると思います。キャッシュを回避またはキャッシュされたデータを削除するにはどうすればよいですか?または、これには別の理由がありますか?
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)
}
}
キャッシングを完全に無効にしないでください。アプリのパフォーマンスが低下するため、不要です。重要なことは、アプリの起動時にキャッシュを明示的に構成し、必要に応じてキャッシュを消去することです。
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/
以下を実行して、キャッシュを無効にできます。
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];
スウィフト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)
}
}
コードを変更できなかったので、テストの目的でコマンドラインが必要であり、これが誰かを助けることができると考えました。
アプリケーション固有のキャッシュは~/Library/Caches/<bundle-identifier-of-your-app>
に保存されるため、以下のように削除して、アプリケーションを再度開きます。
rm -rf ~/Library/Caches/com.mycompany.appname/
私が経験した推測は、あなたが見ているメモリの使用はページのコンテンツからではなく、UIWebViewとそれのすべてがWebKitライブラリをサポートしているからです。 UIWebViewコントロールは大好きですが、非常に大きなコードブロックを取り込む「重い」コントロールです。
このコードは、iOS Safariブラウザーの大きなサブセットであり、静的構造体の大部分を初期化する可能性があります。
さまざまな試みの後、これだけがうまくいきます(ios 8の下):
NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:1 diskCapacity:1 diskPath:nil];
[NSURLCache setSharedURLCache:cache];
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)
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ファイルを変更することは非常に面倒です。