清除UIWebviewcaching

我用UIWebview加载一个网页使用loadRequest:方法,当我离开那个场景我调用[self.webView stopLoading]; 并释放webView。

在第一次启动的活动监视器中,我看到真实内存增加了4MB,并且在多次启动/加载实际内存时没有增加。 它只增加一次。

我检查了webview的保留数。 这是适当的,即0.我认为UIWebView正在caching一些数据。 我如何避免caching或删除caching的数据? 还是有另一个原因呢?

实际上我认为在closuresUIWebView时可能会保留caching的信息。 我尝试从我的UIViewController删除一个UIWebView ,释放它,然后创build一个新的。 新的一个记住,当我回到一个地址,而不必重新加载一切(它记得我以前的UIWebViewlogin)时,我在哪里。

所以有几点build议:

 [[NSURLCache sharedURLCache] removeCachedResponseForRequest:NSURLRequest]; 

这将为特定请求移除caching的响应。 还有一个调用会移除在UIWebView上运行的所有请求的caching响应:

 [[NSURLCache sharedURLCache] removeAllCachedResponses]; 

之后,您可以尝试使用UIWebView删除任何关联的Cookie:

 for(NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) { if([[cookie domain] isEqualToString:someNSStringUrlDomain]) { [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie]; } } 

Swift 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) } } 

不要完全禁用caching,这会损害您的应用程序的性能,这是没有必要的。 重要的是在应用程序启动时显式configurationcaching,并在必要时清除caching。

所以在application:DidFinishLaunchingWithOptions:configurationcaching限制如下:

 - (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 } 

一旦你有正确的configuration,然后当你需要清除caching(例如在applicationDidReceiveMemoryWarning或当你closures一个UIWebView )只是做:

 [[NSURLCache sharedURLCache] removeAllCachedResponses]; 

你会看到内存已经恢复。 我在这里博客了这个问题: http : //twobitlabs.com/2012/01/ios-ipad-iphone-nsurlcache-uiwebview-memory-utilization/

您可以通过执行以下操作来禁用caching:

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

Swift 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) } } 

我的教育猜测是,你所看到的内存使用不是来自页面内容,而是来自加载UIWebView及其所有支持WebKit库。 我喜欢UIWebView控件,但它是一个“沉重的”控件,它牵扯到一大块代码。

此代码是iOS Safari浏览器的一个大型子集,可能会初始化大量静态结构。

经过各种尝试,只有这对我来说很好(在ios 8下):

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

我无法更改代码,所以我需要命令行来testing目的,并认为这可以帮助某人:

特定于应用程序的caching存储在~/Library/Caches/<bundle-identifier-of-your-app> ,因此只需按照以下方式删除并重新打开应用程序

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

对于迅捷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) 

我从文档加载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]; 

它拒绝抛出它的caching数据! 令人沮丧!

我正在做一个PhoneGap(Cordova)应用程序。 我没有在孤立的UIWebView中尝试过。

Update1:我find了 。
更改html文件,虽然看起来很杂乱。